Python之Tkinter:動作
進行介面程式設計,首先少不了以下幾個重要部分:
l 窗體
l 控制元件
l 動作
窗體是容器,各式各樣的控制元件放置在容器中,每種控制元件在觸發之後都會執行一定的指令,即完成它的動作。
怎樣將控制元件繫結到一個命令上?一般來說在建立控制元件的時候,使用引數command來指定要執行的動作,這個動作可以使以下幾類情況:
l 普通函式
l 同屬於一個類的其他成員函式
l 內建函式
l lamda函式
怎樣建立視窗?一般來說有這麼幾種方法,一種是過程式的,使用Tk()。還有一種是物件導向式的,即:繼承自Frame. Tk()返回的物件是根容器,Frame產生的物件可以放置在Tk()返回的物件中。
每個視窗在建立之後,使用pack對自己進行佈局,並使自己可見。佈局的方式可以使用expand、fill、side等。
控制元件對事件的繫結呼叫函式bind,第一個引數為表示事件的字串,第二個為要執行的動作,動作的來源前面已經敘述。
下面為一些例子:
- #!/usr/bin/python
- from Tkinter import *
- def quit():
- print "I have to leave now ..."
- import sys
- sys.exit()
- b = Button(None,text="quit",bg="red",command=quit)
- b.pack()
- b.mainloop()
建立一個Button,點選後執行的動作為退出。
- #!/usr/bin/python
- from Tkinter import *
- class ClassCall():
- def __init__(self):
- self.msg="call from a class. "
- def __call__(self):
- print self.msg
- import sys
- sys.exit()
- widget = Button(None,text="test",command=ClassCall())
- widget.pack()
- widget.mainloop()
將一個類的例項指定為動作,預設時呼叫該類的__call__方法。
- #!/usr/bin/python
- from Tkinter import *
- class InnerClass():
- def __init__(self):
- self.b = Button(None,text="test",command = self.call)
- self.b.pack()
- def call(self):
- print "I am leaving now..."
- import sys
- sys.exit()
- InnerClass()
- mainloop()
呼叫同一個類內部的成員函式
- #!/usr/bin/python
- from Tkinter import *
- class GuiDesign():
- def __init__(self,parent=None):
- self.top = Frame(parent)
- self.top.pack()
- self.data = 0
- self.layout()
- def layout(self):
- Button(self.top,text="exit",command=self.top.quit).pack(side = LEFT)
- Button(self.top,text="hi",command=self.hi).pack(side = RIGHT)
- def hi(self):
- self.data += 1
- print "hi:%d" % self.data
- frm = Frame()
- frm.pack() #easy to make mistake here.
- Label(frm,text="hello").pack(side=TOP)
- GuiDesign(frm).top.mainloop()
將Frame物件作為引數使用
- #!/usr/bin/python
- from Tkinter import *
- def showPosEvent(event):
- print `Widget=%s X=%s Y=%s` % (event.widget, event.x, event.y)
- print `Got key perss:`,event.char
- tkroot = Tk()
- labelfont = (`courier`, 20, `bold`)
- widget = Label(tkroot, text=`Hello bind world`)
- widget.config(bg=`red`, font=labelfont)
- widget.config(height=5, width=20)
- widget.pack(expand=YES, fill=BOTH)
- widget.bind(`<KeyPress>`, showPosEvent)
- widget.focus()
- tkroot.title(`Click Me`)
- tkroot.mainloop()
響應按鍵事件,以及動態配置控制元件的方式