GUI編程之tkinter

鏈客,專爲開發者而生,有問必答!編程

此文章來自區塊鏈技術社區,未經容許拒絕轉載。
圖片描述瀏覽器

  1. 前言

本文內容爲使用Python3的tkinter模塊,開發GUI。在閱讀本文前,請確保你已經或可能知足如下條件:框架

電腦中已經安裝配置好Python3環境
瞭解Python3的基礎語法,好比導入模塊,基礎語句,面向對象
學習GUI編程指南:ssh

在這個GUI領域QT橫行的年代,依舊有學習tkinter的價值。要學習GUI編程,你大概會經歷這樣一條路徑:ide

認識tkinter模塊,寫一個簡單GUI程序
認識各類控件、學習佈局、使用容器
實戰以檢驗動手能力和想象力
PS:你可能還須要瞭解一些消息驅動的知識
下面咱們進入正式的學習。函數

  1. 認識Tkinter模塊,寫一個簡單的GUI程序

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的的文件裏,這樣,這個程序能夠雙擊啓動,並且在啓動時不會開始命令行(也就是不會彈出小黑框)。體驗一下你就知道我在說什麼了~

  1. 認識控件

在上邊的代碼中咱們使用了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()

位置:容許自定義組件的大小和位置

如今讓咱們與這些控件與佈局來一一過招吧。

  1. 按鈕控件:Button

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() # 設置做用中的背景色與前景色,狀態設置爲做用中

對其餘屬性感興趣的讀者,能夠本身嘗試一下其餘屬性,限於篇幅小編在這裏就不贅述了~

  1. 畫布控件:Canvas

畫布控件,是能夠在其上畫圖像的控件,能夠在其上建立圖像,如直線,矩形,橢圓等。

下列是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()

  1. 複選框控件:Checkbutton

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()以前使用。

  1. 輸入控件:Entry

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上顯示輸入內容。

  1. 標籤控件: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()

  1. 列表框控件:Listbox

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'

表示列表末尾

  1. 菜單控件:Menu

能夠用來建立三種菜單,即主菜單、 下拉菜單、快捷式菜單。

主菜單

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()

  1. 消息控件:Message

與Label相似,是用來顯示文字的空間,但Message控件用來顯示多行不可編輯的文字,且它能夠自動編排文字的位置。

import tkinter as tk
from tkinter import Message
win = tk.Tk()
txt = "這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串,這是一個長長的字符串。"

Message(win,text=txt).pack()
win.mainloop()

  1. 單選按鈕:Radiobutton

與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()

  1. 滑動條控件:Scale

Scale控件能夠建立一個遊標尺同樣的滑動條。

from tkinter import Scale
win = tk.Tk()
Scale(win, from_=0, to=10).pack()
win.mainloop()

  1. 滾動條控件:Scrollbar

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()

  1. 文本框控件:Text

Text控件用來建立一個文本框,文本框的內容能夠是多行,格式化的,用戶能夠修改文本框中的內容。常常別用做文本瀏覽器或者網頁瀏覽器。

from tkinter import Text
win = tk.Tk()
Text(win, width=100, height=30).pack()
win.mainloop()

  1. 菜單按鈕控件:Menubutton

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()

  1. 框架控件:Frame

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()

  1. 獨立窗口控件:Toplevel

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()

相關文章
相關標籤/搜索