Python圖形化使用者介面

來源:互聯網
上載者:User

標籤:python   tkinter   

tkinter是Python中可用於構建GUI的眾多工具集之一。

tkinter模組
# 可以使用import tkinter as tk並通過tk.thing去引用其中的內容from tkinter import *window = Tk()window.mainloop()

以上代碼可以顯示一個空白的根視窗。可以將其看成是應用程式的最外層容器,建立其他外掛程式(widget)的時候就需要用到它。如果關閉螢幕上的視窗,則相應的視窗對象就會被銷毀。所有的應用程式都只有一個主視窗;此外,還可以通過TopLevel這個小外掛程式來建立額外的視窗。

tkinter小外掛程式包括Button, Canvas, Checkbutton, Entry, Frame, Label, Listbox, Menu, Message, Menubutton, Text, TopLevel等。

可變的變數

在Python中字串、整數、浮點數以及布爾值都是不可變的,於是tkinter內建了一些類型;他們可以就地更新,並可以在其值發生變化時通知相關的外掛程式。

tkinter中的可變類型

不可變類型 可變類型
int IntVar
string StringVar
bool BooleanVar
double DoubleVar
模型、視圖、控制器

顧名思義,視圖用於把資訊顯示給使用者;模型則只是儲存資料;控制器則可以更新應用程式的模型,並進而出發相應的視圖發生變化。

如下例子實現點擊按鈕之後標籤上的計數增加:

from tkinter import *# The controller.def click():    counter.set(counter.get() + 1)if __name__ == ‘__main__‘:    # More initialization    window = Tk()    # The model.    counter = IntVar()    counter.set(0)    # The views.    frame = Frame(window)    frame.pack()    button = Button(frame, text=‘Click‘, command=click)    button.pack()    label = Label(frame, textvariable=counter)    label.pack()    window.mainloop()
使用Lambda

如果我們不僅希望能增加counter的值,還希望能降低它的值。則我們需要添加另一個按鈕和另一個控制器函數。代碼如下:

from tkinter import *# The controller.def click_up():    counter.set(counter.get() + 1)def click_down():    counter.set(counter.get() - 1)if __name__ == ‘__main__‘:    # More initialization    window = Tk()    # The model.    counter = IntVar()    counter.set(0)    # The views.    frame = Frame(window)    frame.pack()    button = Button(frame, text=‘Up‘, command=click_up)    button.pack()    button = Button(frame, text=‘Down‘, command=click_down)    button.pack()    label = Label(frame, textvariable=counter)    label.pack()    window.mainloop()

上述實現代碼看起來有點傻,click_upclick_down做的事情看起來幾乎是一樣的,應該將它們合成一個。這時,我們應該顯示的把counter傳遞給函數,而不是使用全域變數。

# The model.counter = IntVar()counter.set(0)# One controller with parametersdef click(variable, value):    varaible.set(variable.get() + value)

tkinter要求由按鈕(以及別的外掛程式)出發的控制器函數不能含有參數,目的就是為了以同一種方式去調用它們。我們要做的事情就是:對這個帶有兩個參數的函數進行處理,使其變成一個不帶參數的函數。

一個好一點的做法是使用lambda函數,它使我們能夠建立一個沒有名字的單行函數。

from tkinter import *window = Tk()# The modelcounter = IntVar()counter.set(0)# General controller.def click(var, value):    var.set(var.get() + value)# The views.frame = Frame(window)frame.pack()button = Button(frame, text=‘Up‘, command=lambda: click(counter, 1))button.pack()button = Button(frame, text=‘Down‘, command=lambda: click(counter, -1))button.pack()label = Label(frame, textvariable=counter)label.pack()window.mainloop()

這段代碼分別為兩個按鈕建立了一個不帶參數的lambda函數,這兩個lambda函數會將正確的值傳進click。

樣式
from tkinter import *window = Tk()# 字型button = Button(window, text=‘hello‘, font=(‘Courier‘, 14, ‘bold italic‘))# 布局button.pack(side=‘left‘)# 顏色label = Label(window, text=‘hello‘, bg=‘green‘, fg=‘white‘)label.pack()window.mainloop()

控制布局,就可以使用pack,也可以使用grid,但是不能兩者都用。

from tkinter import *window = Tk()button = Button(window, text=‘button1‘, font=(‘Courier‘, 14, ‘bold italic‘))button.grid(row=0, column=0)label = Label(window, text=‘label1‘, bg=‘green‘, fg=‘white‘)label.grid(row=0, column=1)label = Label(window, text=‘label2‘, bg=‘green‘, fg=‘white‘)label.grid(row=1, column=1)window.mainloop()

可以使用rowspan和columnspan設定外掛程式所佔據的行數,預設為1。

物件導向的GUI

幾乎所有真實的GUI都是以類和對象來建造的:他們講模型、視圖和控制器一起放到一個乾淨整潔的包(package)中。例如下面的計數器函數,其模型是Counter類的一個名為self.state的成員變數,其控制器是upClickquitClick方法。

from tkinter import *class Counter:    ‘‘‘A simple counter GUI using object-oriented programming.‘‘‘    def __init__(self, parent):        ‘‘‘Create the GUI.‘‘‘        # Framework.        self.parent = parent        self.frame = Frame(parent)        self.frame.pack()        # Model.        self.state = IntVar()        self.state.set(1)        # Label displaying current state.        self.label = Label(self.frame, textvariable=self.state)        self.label.pack()        # Buttons to control application.        self.up = Button(self.frame, text=‘up‘, command=self.upClick)        self.up.pack(side=‘left‘)        self.right = Button(self.frame, text=‘quit‘, command=self.quitClick)        self.right.pack(side=‘left‘)    def upClick(self):        ‘‘‘Handle click on ‘up‘ button.‘‘‘        self.state.set(self.state.get() + 1)    def quitClick(self):        ‘‘‘Handle click on ‘quit‘ button.‘‘‘        self.parent.destroy()if __name__ == ‘__main__‘:    window = Tk()    myapp = Counter(window)    window.mainloop()

參考資料:
《Python編程實踐》
《Practical Programming An Introduction to Computer Science Using Python》

Python圖形化使用者介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.