鏈客,專爲開發者而生,有問必答!編程
此文章來自區塊鏈技術社區,未經容許拒絕轉載。瀏覽器
本文內容爲使用Python3的tkinter模塊,開發GUI。在閱讀本文前,請確保你已經或可能知足如下條件:框架
電腦中已經安裝配置好Python3環境
瞭解Python3的基礎語法,好比導入模塊,基礎語句,面向對象
學習GUI編程指南:ssh
在這個GUI領域QT橫行的年代,依舊有學習tkinter的價值。要學習GUI編程,你大概會經歷這樣一條路徑:ide
認識tkinter模塊,寫一個簡單GUI程序
認識各類控件、學習佈局、使用容器
實戰以檢驗動手能力和想象力
PS:你可能還須要瞭解一些消息驅動的知識
下面咱們進入正式的學習。函數
import tkinter as tk # 引入tkinter模塊,並命名爲tk
win = tk.Tk() # 建立主窗口
win.mainloop() # 進入消息循環,顯示窗口界面
要是用tkinter,首先引入該模塊,爲了方便命名爲tk。oop
使用tk的通常套路是,先建立一個主窗口,也就是一個Tk()類, 進行一些列操做以後需,進入消息循環。佈局
如今咱們來作點簡單的事:post
import tkinter as tk # 引入tkinter模塊,並命名爲tk學習
win = tk.Tk() # 建立主窗口
win.title("Hello") # 標題
win.geometry("400x400+400+200") # 大小和位置
text = "Hello, Majesty!" # 要顯示的內容
b = tk.Label(win, text=text).pack()
win.mainloop()
你能夠將上述代碼保存在一個擴展名爲pyw的的文件裏,這樣,這個程序能夠雙擊啓動,並且在啓動時不會開始命令行(也就是不會彈出小黑框)。體驗一下你就知道我在說什麼了~
在上邊的代碼中咱們使用了Label控件,Label控件是Tk最經常使用的組件之一,能夠用來顯示文本和圖片等。在tkinter中,一共提供了15個控件,下面咱們來認識一下它們。
控件名稱
描述
Button
按鈕控件;在程序中顯示按鈕。
Canvas
畫布控件;在窗口中畫圖,如線條等元素
Checkbutton
多選框控件;用於在程序中提供多項選擇框
Entry
輸入控件;用於顯示簡單的文本內容
Frame
框架控件;在屏幕上定義一個區域,用來做爲容納其餘控件的容器
Label
標籤控件;能夠顯示文本和位圖
Listbox
列表框控件;在Listbox窗口小部件是用來顯示一個字符串列表給用戶
Menubutton
菜單按鈕控件,因爲顯示菜單項。
Menu
菜單控件;顯示菜單欄,下拉菜單和彈出菜單
Message
消息控件;用來顯示多行文本,與label比較相似
Radiobutton
單選按鈕控件;顯示一個單選的按鈕狀態
Scale
滑動條控件;顯示一個數值刻度,爲輸出限定範圍的數字區間
Scrollbar
滾動條控件,當內容超過可視化區域時使用,如列表框。.
Text
文本控件;用於顯示多行文本
Toplevel
容器控件;用來提供一個單獨的對話框,和Frame比較相似
除此以外,你可能還須要瞭解一下上述控件都具備的共同屬性,以下表:
標準屬性也就是全部控件的共同屬性,如大小,字體和顏色等等。
屬性
描述
anchor
錨位:定位控件在窗口子內的位置。
background(bg)
背景顏色:用來定義控件的背景顏色
bitmap
位圖:定義顯示在控件中位圖文件
borderwidth
邊框寬度:定義控件的邊框寬度
command
命令:指定特定的函數
cursor
光標:當鼠標指針通過控件時鼠標指針的類型
font
控件字體:用來定義控件上顯示的字體,包括字體,大小,樣式
foreground(fg)
前景顏色:定義控件的前景(字體)顏色
height
高度:定義控件的高度
image
圖像:定義顯示在控件內的圖片文件
justify
對齊:定義多行文字標題的排列方式
padx
水平距離:定義控件內文字或圖片與控件邊框之間的水平距離。
pady
垂直距離:定義控件內文字或圖片與控件邊框之間的垂直距離。
relief
邊框形式:定義控件的邊框形式,好比2D或者3D
text
文字:定義控件的標題文字
variable
變量:將控件的數值映射到一個變量上。
width
寬度:定義控件的寬度
關於以上屬性的注意點:
anchor:能夠是N、S、E、W、NE、SW、SE、NW、CENTER,關因而什麼意思,請去好好學學英語吧。
bg、fg:建議使用通用的「#rrggbb」,形式的數字,如,「#fffffff」。
cursor:是指針類型,能夠是:crosshair、watch、xterm、fleur、arrow。
font:使用時,要賦予一個元組如 font=("Times", 8, 'bold'),分別表明,字體,大小和樣式,字體請查看,系統默認安裝的字體,樣式能夠是bold、italic、underline、overstrike。
justify:能夠是LEFT、CENTER、RIGHT。
relief:若是爲2D,能夠是FLAT、SOLID,若是是3D,能夠是SUNKEN、RIDGE、RAISED。
瞭解了上述屬性以後,你可能還須要瞭解一下tk的佈局管理器tk提供了三種佈局方式的佈局管理器,分別是pack()、grid()、place()
佈局方法
描述
pack()
包裝:按照添加的順序,自動分配到合適的位置上
grid()
網格:按照空間,(行/列)佈局成一個表格的樣子
place()
位置:容許自定義組件的大小和位置
如今讓咱們與這些控件與佈局來一一過招吧。
Button()組件用來建立一個按鈕,按鈕內能夠顯示文字或者圖片!
下面咱們來使用Button():
from tkinter import Button
b = Button(win, text="close", command=win.quit).pack()
Button控件中有如下幾種方法:
方法/屬性
描述
flash()
將前景與背景顏色呼喚來產生閃爍效果
invoke()
執行command所定義的函數
activebackground
定義按鈕在做用中的背景顏色
activeforeground
定義按鈕在做用中的前景顏色
default
若是設置此屬性,則此按鈕爲默認按鈕
compound
文本和圖像的混合模式
disableforeground
按鈕不可用時的前景色
overrelief
鼠標飄過按鈕時的鼠標樣式
state
指定按鈕的狀態
takefocus
使用Tab改變按鈕焦點,默認開啓
underline
文字加下劃線
下面看個demo:
Button(win, text="0", underline=0,command=win.quit).pack() # 下劃線
Button(win, text="1",
activeforeground="#ff00ff", activebackground="#00ff00", state="active").pack() # 設置做用中的背景色與前景色,狀態設置爲做用中
對其餘屬性感興趣的讀者,能夠本身嘗試一下其餘屬性,限於篇幅小編在這裏就不贅述了~
畫布控件,是能夠在其上畫圖像的控件,能夠在其上建立圖像,如直線,矩形,橢圓等。
下列是Canvas控件中的方法:
Method/Attribute
Description
create_arc(coord, start, extent, fill)
建立弧形(扇形)coord定義左上角與右下角的座標start是起始角度extent是結束角度(逆時針)fill是填充色
create_bitmap(x, y, bitmap)
建立一個位圖
create_image(x, y, image)
建立一張圖片image須要時PhotoImage或BitmapImage類的實例變量
create_line(x0, y0, … , xn,yn, options)
建立一條線,xn,yn是線上的點。
create_oval(x0, y0, x1,y1, options)
建立一個圓形或者橢圓
create_polygon(x0, y0, … , xn,yn, options)
穿件一個至少三個點的多邊形
create_rectangle(x0, y0, … , xn,yn, options)
建立一個矩形
create_text(x0, y0, text, options)
建立一個字符串
下面來看一個demo:
from tkinter import Canvas as C
win = tk.Tk()
coord = 50,50,200,200
c = C(win)
c.create_arc(coord, start=0, extent = 120, fill="red")
c.pack()
win.mainloop()
接下來建立位圖:
c = C(win)
c.create_bitmap(40,40, bitmap="error")
c.pack()
建立圖片:
from tkinter import Canvas as C
from tkinter import PhotoImage
win = tk.Tk()
c = C(win)
img=PhotoImage(file="image.png")
c.create_image(100,100, image=img)
c.pack()
win.mainloop()
建立一條線:
from tkinter import Canvas as C
win = tk.Tk()
c = C(win)
c.create_line(40,40, 300,40, 90,120, width=2, fill="#ff00ff")
c.pack()
win.mainloop()
建立一個圓:
from tkinter import Canvas as C
win = tk.Tk()
c = C(win)
c.create_oval(50,50, 250,250,fill='green', outline="blue")
c.pack()
win.mainloop()
建立多邊形(如三角形):
from tkinter import Canvas as C
win = tk.Tk()
c = C(win)
c.create_polygon(10,10, 320,80, 150,150, outline='black')
c.pack()
win.mainloop()
建立矩形:
from tkinter import Canvas as C
win = tk.Tk()
c = C(win)
c.create_rectangle(10,10, 220,220,outline='black')
c.pack()
win.mainloop()
建立文本:
from tkinter import Canvas as C
win = tk.Tk()
c = C(win)
c.create_text(10,10,text="Hello , 前面的demo親手作一遍了麼?" ,anchor='w')
c.pack()
win.mainloop()
Checkbutton用來建立複選框。
from tkinter import Checkbutton
win = tk.Tk()
cb1 = Checkbutton(win, text="籃球").pack()
cb2 = Checkbutton(win, text="足球").pack()
cb3 = Checkbutton(win, text="網球").pack()
win.mainloop()
Checkbutton
Checkbutton的屬性和方法以下:
Method/Attribute
Description
onvalue、offvalue
指定variable屬性所指定的變量所要存儲的數值。選中設置爲onvalue未選中爲offvalue
indicatoron
將此屬性設置成零,能夠將整個控件變成複選框
select()
將複選框的值變爲onvalue
flash()
閃爍效果,同Button
invoke()
指定command,同Button
toggle()
改變核取狀態的按鈕
PS:上述方法,請在pack()以前使用。
Entry控件用來建立一個單行的文本框。
該控件內有如下屬性/方法:
Method/Attribute
Description
show
爲輸入文字時顯示在控件內的內容
get()
讀取控件內的文字
下面看一個demo:
from tkinter import Label
from tkinter import Entry
from tkinter import Button
win = tk.Tk()
Label(win, text="請輸入密碼:").pack()
e = Entry(win, show='*')
e.pack()
label = Label(win)
label.pack()
def do():
label.config(text=e.get())
button = Button(win, text="OK", command=do)
button.pack()
win.mainloop()
demo中使用了Label、Entry、Button三個控件,功能大概是這樣,輸入密碼,會顯示"*",按肯定會在Label上顯示輸入內容。
在前文已經數次用到了Label控件,它的做用相似於print()函數,它將文本打印在窗口體上。
在這裏就很少說了。
from tkinter import *
root = Tk()
Label(root, text="red", bg="red", fg="white").pack(side=LEFT)
Label(root, text="green", bg="green", fg="black").pack(side=LEFT)
Label(root, text="blue", bg="blue", fg="white").pack(side=LEFT)
mainloop()
Listbox用來建立一個列表框,列表框內包含不少選項,用戶能夠選擇一項或者多項。
from tkinter import Listbox
win = tk.Tk()
name = ['蹦牀',"射箭","攀巖"]
listbox = Listbox(win)
for i in name:
listbox.insert('end', i)
listbox.pack()
win.mainloop()
Listbox控件中提供了下列方法/屬性(僅列舉經常使用的幾個):
Method/Attribute
Description
activate(index)
將給定索引號對應的選項激活(在其文本下方畫一條下劃線)
delete(first, last=None)
刪除參數 first 到 last 範圍內的全部選項
get(first, last=None)
返回包含參數 first 到 last 範圍內的全部選項的文本的元組
index(index)
返回參數index選項的序號
insert(index, *elements)
添加一個或多個項目到 Listbox 中
size()
返回 Listbox 組件中選項的數量
'end'
表示列表末尾
能夠用來建立三種菜單,即主菜單、 下拉菜單、快捷式菜單。
主菜單
from tkinter import Menu
def doSth():
pass
win = tk.Tk()
win.title("Menu")
win.geometry("400x400")
mainmenu = Menu(win)
mainmenu.add_command(label="file", command=doSth)
mainmenu.add_command(label="edit", command=doSth)
mainmenu.add_command(label="view", command=doSth)
mainmenu.add_command(label="window", command=doSth)
mainmenu.add_command(label="tool", command=doSth)
mainmenu.add_command(label="help", command=doSth)
win.config(menu=mainmenu)
win.mainloop()
下拉菜單
import tkinter as tk
from tkinter import Menu
def doSth():
pass
win = tk.Tk()
win.title("Menu")
win.geometry("400x300")
mainmenu = Menu(win)
filemenu = Menu(mainmenu, tearoff=0)
filemenu.add_command(label='New', command=doSth)
filemenu.add_command(label='Save', command=doSth)
filemenu.add_separator()
filemenu.add_command(label='Quit', command=doSth)
mainmenu.add_cascade(label="file", menu=filemenu)
mainmenu.add_command(label="edit", command=doSth)
mainmenu.add_command(label="view", command=doSth)
mainmenu.add_command(label="window", command=doSth)
mainmenu.add_command(label="tool", command=doSth)
mainmenu.add_command(label="help", command=doSth)
win.config(menu=mainmenu)
win.mainloop()
快捷菜單
win = tk.Tk()
win.title("Menu")
win.geometry("400x200")
mainmenu = Menu(win)
pmenu = Menu(win, tearoff=0)
def showpmenu(event):
pmenu.post(event.x_root, event.y_root)
win.bind("<Button-3>", showpmenu)
win.mainloop()
與Label相似,是用來顯示文字的空間,但Message控件用來顯示多行不可編輯的文字,且它能夠自動編排文字的位置。
import tkinter as tk
from tkinter import Message
win = tk.Tk()
txt = "這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串。"
Message(win,text=txt).pack()
win.mainloop()
與Checkbutton相似,只不過Checkbutton是能夠單選,也能夠多選,而Radiobutton是單選。
import tkinter as tk
from tkinter import Radiobutton
win = tk.Tk()
sex=['男','女']
Radiobutton(win, text=sex[0],value=0).pack(anchor='w')
Radiobutton(win, text=sex[1],value=1).pack(anchor='w')
win.mainloop()
Scale控件能夠建立一個遊標尺同樣的滑動條。
from tkinter import Scale
win = tk.Tk()
Scale(win, from_=0, to=10).pack()
win.mainloop()
import tkinter as tk
from tkinter import Scrollbar
from tkinter import Listbox
win = tk.Tk()
sb1 = Scrollbar(win)
sb2 = Scrollbar(win, orient='horizontal')
sb1.pack(side='right', fill='y')
sb2.pack(side='bottom', fill='x')
lb = Listbox(win, yscrollcommand=sb1.set, xscrollcommand=sb2.set)
for i in range(1000):
lb.insert('end', str(i)*100)
lb.pack(side='left', fill='both')
sb1.config(command=lb.yview)
sb2.config(command=lb.xview)
win.mainloop()
Text控件用來建立一個文本框,文本框的內容能夠是多行,格式化的,用戶能夠修改文本框中的內容。常常別用做文本瀏覽器或者網頁瀏覽器。
from tkinter import Text
win = tk.Tk()
Text(win, width=100, height=30).pack()
win.mainloop()
from tkinter import *
win = Tk()
def doSth():
pass
mb = Menubutton(win, text="點我", relief=RAISED)
mb.pack()
filemenu = Menu(mb, tearoff=False)
filemenu.add_command(label="打開", command=doSth)
filemenu.add_command(label="保存", command=doSth)
filemenu.add_separator()
filemenu.add_command(label="退出", command=win.quit)
mb.config(menu=filemenu)
mainloop()
Frame控件是在屏幕上的一個矩形區域。其主要做用是做爲其餘組件的框架基礎,或爲其餘組件提供間距填充。
from tkinter import *
Label(text="標籤1").pack()
separator = Frame(height=12, bd=1, relief=SUNKEN)
separator.pack(fill=X, padx=5, pady=5)
Label(text="標籤2").pack()
mainloop()
其餘控件也能夠附着在Frame上。
Label(text="標籤1").pack()
f = Frame(height=12, bd=12,relief='sunken')
Label(f, text="標籤2").pack()
f.pack(padx=5, pady=5)
mainloop()
from tkinter import *
root = Tk()
def create_toplevel():
top = Toplevel() top.title("Toplevel") msg = Message(top, text="Here is a window of toplevel!") msg.pack()
Button(root, text="建立獨立窗口", command=create_toplevel).pack()
mainloop()