Python 提供了多個圖形開發界面的庫,幾個常用 Python GUI 庫如下:
-
Tkinter: Tkinter 模塊(Tk 接口)是 Python 的標准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多數的 Unix 平台下使用,同樣可以應用在 Windows 和 Macintosh 系統里。Tk8.0 的后續版本可以實現本地窗口風格,並良好地運行在絕大多數平台中。
-
wxPython:wxPython 是一款開源軟件,是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程序員很方便的創建完整的、功能健全的 GUI 用戶界面。
-
Jython:Jython 程序可以和 Java 無縫集成。除了一些標准模塊,Jython 使用 Java 的模塊。Jython 幾乎擁有標准的Python 中不依賴於 C 語言的全部模塊。比如,Jython 的用戶界面將使用 Swing,AWT或者 SWT。Jython 可以被動態或靜態地編譯成 Java 字節碼。
tkinter完整的教程就不再此贅述了,網上很多
參考:
https://www.cnblogs.com/muziyunxuan/p/8268179.html
https://blog.csdn.net/yingshukun/article/details/78705337
http://www.runoob.com/python/python-gui-tkinter.html
ps:
事件的綁定、菜單再此就不記錄了。
菜單:https://blog.csdn.net/wangyiyan315/article/details/16367551
事件綁定:https://blog.csdn.net/u014027051/article/details/53813152
我學習這個只是為了給我的一些自動化測試或者性能測試代碼一個友好的輸入界面,因此只做了部分實踐。
這里我使用的是第一種Tkinter,Python3.x 版本使用的庫名為 tkinter,即首寫字母 T 為小寫。
引用:
注意模塊導入方式,否則代碼會有差別
import tkinter from tkinter import messagebox,ttk #如果不單獨引用這2個模塊,使用時會報錯name 'messagebox' is not defined
#messagebox是彈出提示框要使用的模塊,ttk是下拉選擇框使用的模塊ttk.Combobox()
基礎設置:
#實例化一個窗口對象 root = tkinter.Tk() #窗口的標題 root.title('我是一個窗口') #窗口的位置用x,y調節 root.resizable(3,6) #指定主框體大小 root.geometry('600x400')
#進入消息循環
root.mainloop()
#關閉窗口
root.quit
幾種輸入控件(widget)&輸入數據獲取--完整使用示例Entry,Text,Spinbox,StringVar等:
Tkinter中一些組件(Button, Label等) 如果設置一個textvariable屬性為一個StringVar(IntVar, DoubleVar)對象。 當這個對象的值被重新設置的時候,組件上的顯示文字就會自動變成新的值。#文本輸入框 tkinter中的entry和text這兩個輸入框的height和width都是表示可以輸入的英文字數,而不是像素值
#Entry為單行文本輸入框||Text為多行文本輸入框||Spinbox與Entry類似但可以指定輸入范圍值,當用戶只需要從極少的數值中進行選擇的時候,就可以使用Spinbox取代Entry
#Spinbox(root,from_=0,to=10,increment=2).grid(column=1,row=0) increment表示增量
#Spinbox(root,values=('+','-','*','/')).grid(column=1,row=0)
input_value1 = tkinter.IntVar()#IntVar只能獲取輸入的整數型變量,StringVar字符串,DoubleVar雙浮點變量。input_value1.get()獲取控件的輸入值,set()設置控件的值
#textvariable為可變文本顯示,與StringVar等配合着用(其他2種輸入文本的方式也可以與之配合使用取值),如果設置show屬性,則界面密文顯示
input1 = tkinter.Entry(root,textvariable=input_value1,width=12,show='*')
#將小部件放置到主窗口中,行和列都要從0開始,如果上來就說第二行第二列則不生效
input1.grid(column=0,row=1)
self.input_value1.set('')#不設置初始值的話會默認顯示0
#當程序運行時,光標默認會出現在該文本框中
input1.focus()
按鈕&點擊事件之后執行的動作Button,command:
#command指定按鈕的回調函數,點擊按鈕之后會執行這個方法(指定的函數要在被指定前定義,否則會報錯name 'function' is not defined)
tkinter.Button(root,text='=',font=("黑體",11, "bold"),command=functionname).grid(column=3,row=1)
#點擊按鈕關閉窗口
tkinter.Button(text='關閉',command=root.quit).pack()
#如果指定的函數要傳參,則使用lambda(被指定的函數可以在被指定后再定義,不影響運行使用)
tkinter.Button(root,text='=',font=("黑體",11, "bold"),command=lambda:functionname(a)).grid(column=3,row=1)
下拉選擇列表 Combobox:
from tkinter import ttk
operator = tkinter.StringVar()
#創建下拉列表 selec = ttk.Combobox(root,textvariable=operator,width=8) # 設置下拉列表的值元組或者列表 selec['values'] = ['+','-','*','÷'] selec.grid(column=1,row=1) #設置下拉列表默認顯示的值,0為 selec['values'] 的下標值 selec.current(0)
#綁定事件
selec.bind("<<ComboboxSelected>>",func) #綁定事件,(下拉列表框被選中時,綁定func()函數)
頁面顯示的文本或圖片(python內置的或者其他圖片都可以) Label:
#font為字體bold為加粗,bg為背景色其他控件也可以設置背景色
tkinter.Label(root,text='請輸入:',font=("黑體",10, "bold"),bg='Red').grid(column=0,row=0)
或者(屬性都可以這樣添加):
w = tkinter.Label(root,text='請輸入:',font=("黑體",10, "bold")
w.grid(column=0,row=0)
w['bg'] = 'Red'
Python內置了10種位圖,可以直接使用,設置bitmap即可,對應如下:
主窗口內嵌框架 Frame:
#from tkinter import *,則fill=BOTH,expand=YES
#import tkinter,則expand=tkinter.YES或者expand='yes'
tkinter.Frame(root,height=70,width=130,bg='blue').pack(fill='both',expand=tkinter.YES)
#內嵌的窗口布置控件時和主窗口用法一樣eg:
frame = tkinter.Frame(root)
frame.pack()
tkinter.Label(frame,text='哈哈哈').pack()
彈窗提示:https://jingyan.baidu.com/article/d45ad1484a1f6169552b8016.html
from tkinter import messagebox
#show只展示信息
messagebox.showinfo(title='這是個提示信息', message='哈哈哈哈')
messagebox.showwarning(title='這是個警告信息', message='警告')
messagebox.showerror(title='這是個錯誤提示', message=result)
#ask會有返回值,可以根據返回值選擇接下來的操作
askyesno askquetion askokcancel askyesnocancel askretrycancel
更新窗口或者控件的屬性configure:
當做了某個操作之后,或者得到某個值之后想要改變主窗口或者控件的屬性,可以用這個方法
#widgetname可以是創建的button或者entry等等控件
widgetname.configure(text='yey',bg='red')
#如果是創建了一寫菜單欄,要生效或者更新的話也需要用到configure。
menubar = tk.Menu(root)
menubar.add_command(label="Quit!", command=root.quit)
#config和configure相同
root.configure(menu=menubar)
root.config(menu=menubar)
布局:https://www.cnblogs.com/muziyunxuan/p/8268179.html
grid布局
grid布局又被稱作網格布局,是最被推薦使用的布局。程序大多數都是矩形的界面,我們可以很容易把它划分為一個幾行幾列的網格,然后根據行號和列號,將組件放置於網格之中。使用grid 布局時,需要在里面指定兩個參數,分別用row 表示行,column 表示列。需要注意的是 row 和 column 的序號都從0 開始。
pack布局
使用 pack布局,將向容器中添加組件,默認第一個添加的組件在最上方,然后是依次向下添加,可以使用屬性去更改填充方式
place布局。
最簡單最靈活的一種布局,使用組件坐標來放置組件的位置。但是不太推薦使用,在不同分辨率下,界面往往有較大差異
ps:一個程序里,只能用一種布局方式,否則會報錯
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
一個小示例:
import tkinter from tkinter import messagebox,ttk class GuiDemo(): def __init__(self,windowtitle): #實例化一個窗口對象,windowtitle為窗口名 self.root = tkinter.Tk() #窗口的標題 self.root.title(windowtitle) #指定主框體大小 self.root.geometry('400x90') return def operation(self): operator = self.operator.get() value1 = self.input_value1.get() value2 = self.input_value2.get() if operator == '+': result = value1 + value2 elif operator == '-': result = value1 - value2 elif operator == '*': result = value1 * value2 elif operator == '÷': result = value1 / value2 #【bug】將顯示結果的部分寫在這個函數里會造成每次計算的結果不斷疊加在前一個結果上,如果結果比之前的長度長就顯示正常, #否則數字顯示疊加混亂,因此將控件布置寫在calculator里,這里只做屬性配置更新 # ret = tkinter.StringVar() # tkinter.Label(self.root,textvariable=ret,bg='Red').grid(column=4,row=1) # print(result) # ret.set(' '+str(result)) self.lab.config(text=result) self.butt.configure(text='結果',bg='green') messagebox.showinfo(title='這是個提示信息', message=result) return def calculator(self): root = self.root self.input_value1 = tkinter.IntVar() input1 = tkinter.Entry(root,textvariable=self.input_value1,width=12) input1.grid(column=0,row=1) self.input_value1.set('')#不設置初始值的話會默認顯示0 #當程序運行時,光標默認會出現在該文本框中 input1.focus() #與Entry類似但可以指定輸入范圍值,當用戶只需要從極少的數值中進行選擇的時候,就可以使用Spinbox取代Entry #increment表示增量 #Spinbox(root,from_=0,to=10,increment=2).grid(column=1,row=0) #Spinbox(root,values=('+','-','*','/')).grid(column=1,row=0) #創建下拉列表 self.operator = tkinter.StringVar() selec = ttk.Combobox(root,textvariable=self.operator,width=8) # 設置下拉列表的值元組或者列表 selec['values'] = ['+','-','*','÷'] selec.grid(column=1,row=1) #設置下拉列表默認顯示的值,0為 selec['values'] 的下標值 selec.current(0) self.input_value2 = tkinter.IntVar() tkinter.Entry(root,textvariable=self.input_value2,width=12,show='*').grid(column=2,row=1) self.input_value2.set('') tkinter.Label(root,text='請輸入:',font=("黑體",10, "bold")).grid(column=0,row=0) tkinter.Label(root,text='請選擇:',font=("黑體",10, "bold")).grid(column=1,row=0) tkinter.Label(root,text='請輸入:',font=("黑體",10, "bold")).grid(column=2,row=0) self.butt = tkinter.Button(root,text='=',font=("黑體",11, "bold"),command=self.operation) self.lab = tkinter.Label(self.root,text=' ',bg='green') self.lab.grid(column=4,row=1) self.butt.grid(column=3,row=1) return def runGui(self): # 進入消息循環 self.root.mainloop() if __name__ == '__main__': app = GuiDemo('計算') app.calculator() app.runGui()

