PythonTkinter:動作

進行介面程式設計,首先少不了以下幾個重要部分:

l  窗體

l  控制元件

l  動作

窗體是容器,各式各樣的控制元件放置在容器中,每種控制元件在觸發之後都會執行一定的指令,即完成它的動作。

         怎樣將控制元件繫結到一個命令上?一般來說在建立控制元件的時候,使用引數command來指定要執行的動作,這個動作可以使以下幾類情況:

l  普通函式

l  同屬於一個類的其他成員函式

l  內建函式

l  lamda函式

怎樣建立視窗?一般來說有這麼幾種方法,一種是過程式的,使用Tk()。還有一種是物件導向式的,即:繼承自Frame. Tk()返回的物件是根容器,Frame產生的物件可以放置在Tk()返回的物件中。

每個視窗在建立之後,使用pack對自己進行佈局,並使自己可見。佈局的方式可以使用expandfillside等。

控制元件對事件的繫結呼叫函式bind,第一個引數為表示事件的字串,第二個為要執行的動作,動作的來源前面已經敘述。

下面為一些例子:

 

  1. #!/usr/bin/python 
  2.  
  3.   
  4.  
  5. from Tkinter import * 
  6.  
  7.   
  8.  
  9. def quit(): 
  10.  
  11.          print "I have to leave now ..." 
  12.  
  13.          import sys 
  14.  
  15.          sys.exit() 
  16.  
  17.   
  18.  
  19. b = Button(None,text="quit",bg="red",command=quit) 
  20.  
  21. b.pack() 
  22.  
  23. b.mainloop() 
  24.  
  25.   

建立一個Button,點選後執行的動作為退出。

 

 

  1. #!/usr/bin/python 
  2.  
  3.   
  4.  
  5. from Tkinter import * 
  6.  
  7.   
  8.  
  9. class ClassCall(): 
  10.  
  11.          def __init__(self): 
  12.  
  13.                    self.msg="call from a class. " 
  14.  
  15.          def __call__(self): 
  16.  
  17.                    print self.msg 
  18.  
  19.                    import sys 
  20.  
  21.                    sys.exit() 
  22.  
  23.   
  24.  
  25. widget = Button(None,text="test",command=ClassCall()) 
  26.  
  27. widget.pack() 
  28.  
  29. widget.mainloop() 

將一個類的例項指定為動作,預設時呼叫該類的__call__方法。

 

 

  1. #!/usr/bin/python 
  2.  
  3.   
  4.  
  5. from Tkinter import * 
  6.  
  7.   
  8.  
  9. class InnerClass(): 
  10.  
  11.          def __init__(self): 
  12.  
  13.                    self.b = Button(None,text="test",command = self.call) 
  14.  
  15.                    self.b.pack() 
  16.  
  17.          def call(self): 
  18.  
  19.                    print "I am leaving now..." 
  20.  
  21.                    import sys 
  22.  
  23.                    sys.exit() 
  24.  
  25.   
  26.  
  27. InnerClass() 
  28.  
  29. mainloop() 
  30.  
  31.   

呼叫同一個類內部的成員函式

 

  1.   
  2.  
  3. #!/usr/bin/python 
  4.  
  5.   
  6.  
  7. from Tkinter import * 
  8.  
  9.   
  10.  
  11. class GuiDesign(): 
  12.  
  13.          def __init__(self,parent=None): 
  14.  
  15.                    self.top = Frame(parent) 
  16.  
  17.                    self.top.pack() 
  18.  
  19.                    self.data = 0 
  20.  
  21.                    self.layout() 
  22.  
  23.                    
  24.  
  25.          def layout(self): 
  26.  
  27.                    Button(self.top,text="exit",command=self.top.quit).pack(side = LEFT) 
  28.  
  29.                    Button(self.top,text="hi",command=self.hi).pack(side = RIGHT) 
  30.  
  31.   
  32.  
  33.          def hi(self): 
  34.  
  35.                    self.data += 1 
  36.  
  37.                    print "hi:%d" % self.data 
  38.  
  39.   
  40.  
  41. frm = Frame() 
  42.  
  43. frm.pack()         #easy to make mistake here. 
  44.  
  45. Label(frm,text="hello").pack(side=TOP) 
  46.  
  47. GuiDesign(frm).top.mainloop() 
  48.  
  49.   

Frame物件作為引數使用

 

 

  1. #!/usr/bin/python 
  2.  
  3.   
  4.  
  5. from Tkinter import * 
  6.  
  7.      
  8.  
  9. def showPosEvent(event): 
  10.  
  11.     print `Widget=%s X=%s Y=%s` % (event.widget, event.x, event.y) 
  12.  
  13.     print `Got key perss:`,event.char 
  14.  
  15.   
  16.  
  17.      
  18.  
  19. tkroot = Tk() 
  20.  
  21. labelfont = (`courier`20`bold`)                
  22.  
  23. widget = Label(tkroot, text=`Hello bind world`
  24.  
  25. widget.config(bg=`red`, font=labelfont)            
  26.  
  27. widget.config(height=5, width=20)                  
  28.  
  29. widget.pack(expand=YES, fill=BOTH) 
  30.  
  31.   
  32.  
  33. widget.bind(`<KeyPress>`,  showPosEvent)             
  34.  
  35. widget.focus()                                   
  36.  
  37. tkroot.title(`Click Me`
  38.  
  39. tkroot.mainloop() 

響應按鍵事件,以及動態配置控制元件的方式