Hello Again Tkinter

二.

Hello,Again

當你先一個大的程序時,通常用類來實現是一個好辦法。下面就是實現咯

from Tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(
            frame, text="QUIT", fg="red", command=frame.quit
            )
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print "hi there, everyone!"

root = Tk()

app = App(root)

root.mainloop()

root.destroy() # optional; see description below


解析:

這個例子用類來實現,構造函數(__init__)被調用,父窗口作爲參數,這個父窗口可以添加許多子窗口。

構造函數有創建Frame窗口開始,Frame是一個簡單容器,在這個例子中這個容器容納了2個控件

frame的實例保存在本地變量frame中,創建好容器後,我們立刻調用pack方法讓框架可見。

接着我們創建了2個button控件,作爲frame的子窗口。

這次,我們將一些選項以關鍵字參數的方式傳遞給構造函數,第一個按鈕的label是“QUIT”

前景色是紅色,第二個button的label是“Hello”,2個按鈕都用command參數,這個選項指定

一個函數,在這個例子中綁定方法,當按鈕被點擊後調用的方法。

這些按鈕的實例作爲這個類的實例的屬性,他們都被pack了,並且帶side=LEFT參數,這個參數表示他們將被

儘可能的防治在frame的左側,第一個放在frame的左側,第二個按鈕就在第一個按鈕的右邊。

默認情況下,控件相對於它的父窗體pack,如果沒有給定參數,默認是TOP-即上下排列


接下來是hello按鈕的回調函數,僅僅在控制檯打印

最後我們提供一些腳本級代碼來創建Tk根窗口,和一個App類的實例,並將root作爲父窗口

接下來是根窗口的消息循環,直到調用了quit方法(點擊了QUIT按鈕),或者窗口關閉。

destroy在某些環境中需要,某些不需要


更多的widget參考

在第二個例子中,Frame窗體被保存在名爲frame的本地變量中,而按鈕控件被保存在實例的屬性中。

這裏是不是隱藏了嚴重的bug呀?當__init__函數返回後,frame就超過變量作用域啦?

放輕鬆;其實根本不需要保持一個窗口實例的引用。Tkinter自動維護一個widget樹(通過每個窗口實例的

master和children屬性),所以在在最後一個窗口實例的引用消失時,窗口不會消失(其實還有引用)

窗口只會在明確的調用destroy方法後纔會真正銷燬。不過,當你想創建窗體後想對它做點什麼事的話,還是需要

保持對widget的引用。


注:如果你不用保持一個窗體的引用,那麼可以用這個辦法

Button(frame,text="hello",command=self.hello).pack(side=LEFT)

pack方法返回值是None,所以爲了安全起見,最好分成2句寫

w = Button(frame, text="Hello", command=self.hello) 

w.pack(side=LEFT)


widget的命名

特別對那些有Tk使用Tcl編程經驗的人來說,對Tkinter中widget的命名很混亂。在

Tcl中,你必須顯示的命名每個widget。舉個例子,以下命令創建一個名爲“OK”的按鈕

作爲名爲“dialog”的窗口的子窗口

button.dialog.ok

在Tkinter中一般這麼寫

ok=Button(dialog)

在Tkinter中ok和dialog都是窗口實例的引用。而不是widget實例的名字

以下是給ok這個窗口實例命名爲“ok”

ok = Button(dialog, name="ok")



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章