- 原文博客鏈接地址
-
Python
提供了多個(gè)圖形開(kāi)發(fā)界面的庫(kù)基跑,幾個(gè)常用Python GUI
庫(kù)如下: -
Tkinter
:Tkinter
模塊(Tk 接口)是Python
的標(biāo)準(zhǔn) Tk GUI 工具包的接口.Tk
和Tkinter
可以在大多數(shù)的Unix
平臺(tái)下使用, 同樣可以應(yīng)用在Windows
和Macintosh
系統(tǒng)里可款。Tk8.0
的后續(xù)版本可以實(shí)現(xiàn)本地窗口風(fēng)格,并良好地運(yùn)行在絕大多數(shù)平臺(tái)中耿战。 -
wxPython
:wxPython
是一款開(kāi)源軟件囱晴,是Python
語(yǔ)言的一套優(yōu)秀的GUI
圖形庫(kù)详囤,允許Python
程序員很方便的創(chuàng)建完整的霜定、功能健全的GUI
用戶界面噩翠。 -
Jython
:Jython
程序可以和Java
無(wú)縫集成巡球。除了一些標(biāo)準(zhǔn)模塊言沐,Jython
使用Java
的模塊邓嘹。Jython
幾乎擁有標(biāo)準(zhǔn)的Python
中不依賴于C
語(yǔ)言的全部模塊。比如险胰,Jython
的用戶界面將使用Swing
汹押,AWT
或者SWT
。Jython
可以被動(dòng)態(tài)或靜態(tài)地編譯成Java
字節(jié)碼
一. Tkinter
介紹
-
Tkinter
是Python
的標(biāo)準(zhǔn)GUI
庫(kù)起便。Python
使用Tkinter
可以快速的創(chuàng)建GUI
應(yīng)用程序棚贾。 - 由于
Tkinter
是內(nèi)置到python
的安裝包中、只要安裝好Python
之后就能import Tkinter
庫(kù)榆综、而且IDLE
也是用Tkinter
編寫(xiě)而成妙痹、對(duì)于簡(jiǎn)單的圖形界面Tkinter
還是能應(yīng)付自如
需要注意: Python3.x
版本使用的庫(kù)名為 tkinter
,即首寫(xiě)字母T
為小寫(xiě)
import tkinter
- 創(chuàng)建一個(gè)GUI程序
- 1、導(dǎo)入
tkinter
模塊 - 2鼻疮、創(chuàng)建控件
- 3怯伊、指定這個(gè)控件的
master
,即這個(gè)控件屬于哪一個(gè) - 4陋守、告訴
GM(geometry manager)
有一個(gè)控件產(chǎn)生了
- 1、導(dǎo)入
1. 主窗口
- 在
iOS
中每一個(gè)APP
都有一個(gè)主窗口window
, 該window
就是所有視圖嘴地城最基礎(chǔ)的視圖View
- 在
Python
中童謠也會(huì)有一個(gè)主窗口, 下面看一下tkinter
生成主窗口的方法
# 主窗口
import tkinter
# 創(chuàng)建主窗口
window = tkinter.Tk()
# 設(shè)置標(biāo)題
window.title('Titanjun')
# 設(shè)置窗口大小
window.geometry('400x400')
# 進(jìn)入消息循環(huán)
window.mainloop()
效果如下
主窗口除了上述方法之外還有以下方法
# 框體大小的可調(diào)性, 分別表示x, y方向的可變性
window.resizable(0, 0)
# 退出
window.quit()
# 刷新頁(yè)面
window.update()
二. Tkinter
組件
-
Tkinter
的提供各種控件震贵,如按鈕,標(biāo)簽和文本框水评,一個(gè)GUI
應(yīng)用程序中使用, 這些控件通常被稱為控件或者部件 - 目前有15種Tkinter的部件, 下面是對(duì)這些部件以及一個(gè)簡(jiǎn)短的介紹
控件 | 描述 |
---|---|
Label |
標(biāo)簽控件, 可以顯示文本和位圖 |
Button |
按鈕控件, 在程序中顯示按鈕 |
Entry |
輸入控件猩系;用于顯示簡(jiǎn)單的文本內(nèi)容 |
Checkbutton |
多選框控件;用于在程序中提供多項(xiàng)選擇框 |
Frame |
框架控件中燥;在屏幕上顯示一個(gè)矩形區(qū)域寇甸,多用來(lái)作為容器 |
Canvas |
畫(huà)布控件;顯示圖形元素如線條或文本 |
Listbox |
列表框控件疗涉;在Listbox 窗口小部件是用來(lái)顯示一個(gè)字符串列表給用戶 |
Menubutton |
菜單按鈕控件拿霉,由于顯示菜單項(xiàng)。 |
Menu |
菜單控件咱扣;顯示菜單欄,下拉菜單和彈出菜單 |
Message |
消息控件绽淘;用來(lái)顯示多行文本,與label 比較類似 |
Radiobutton |
單選按鈕控件闹伪;顯示一個(gè)單選的按鈕狀態(tài) |
Scale |
范圍控件沪铭;顯示一個(gè)數(shù)值刻度,為輸出限定范圍的數(shù)字區(qū)間 |
Scrollbar |
滾動(dòng)條控件偏瓤,當(dāng)內(nèi)容超過(guò)可視化區(qū)域時(shí)使用杀怠,如列表框 |
Text |
文本控件;用于顯示多行文本 |
Spinbox |
輸入控件厅克;與Entry 類似赔退,但是可以指定輸入范圍值 |
PanedWindow |
一個(gè)窗口布局管理的插件,可以包含一個(gè)或者多個(gè)子控件 |
LabelFrame |
一個(gè)簡(jiǎn)單的容器控件, 常用與復(fù)雜的窗口布局 |
tkMessageBox |
用于顯示你應(yīng)用程序的消息框 |
如果之前做過(guò)H5前端開(kāi)發(fā)或者iOS等頁(yè)面相關(guān)開(kāi)發(fā)工作的, 應(yīng)該能到, 其實(shí)這些組件和其他開(kāi)發(fā)語(yǔ)言提供的組件功能相似, 屬性也類似, 下面我們先看一下一些通用的屬性介紹
屬性值 | 屬性描述 |
---|---|
bg |
控件的背景顏色 |
fg |
組件中的字體顏色 |
font |
設(shè)置文本的字體樣式和字號(hào) |
height |
設(shè)置控件高度 |
width |
設(shè)置控件寬度 |
bd |
設(shè)置控件邊框的大小, 默認(rèn)2個(gè)像素 |
relief |
設(shè)置邊框樣式, 有falt, sunken, raised, groove, ridge, 默認(rèn)flat |
text |
設(shè)置文本內(nèi)容 |
anchor |
瞄點(diǎn), 控制文本的位置, 默認(rèn)居中(可選: n北, e東, s南, w西, center居中, ne se, sw, nw) |
justify |
顯示多行文本的時(shí)候,設(shè)置不同行之間的對(duì)齊方式(left, right, center) |
wraplength |
根據(jù)寬度限制控件每行顯示的字符的數(shù)量 |
underline |
下劃線, 默認(rèn)沒(méi)有; 取值就是帶下劃線的字符串索引,為 0 時(shí)硕旗,第一個(gè)字符帶下劃線 |
padx |
在x軸方向上的內(nèi)邊距(padding)窗骑,是指控件的內(nèi)容與控件邊緣的距離 |
pady |
在y軸方向上的內(nèi)邊距(padding) |
1. Label
控件
-
Label
控件用以顯示文字和圖片. -
Label
通常被用來(lái)展示信息, 而非與用戶交互 -
Label
也可以綁定點(diǎn)擊等事件, 只是通常不這么用
label = tkinter.Label(window,
text="我是一只小鴨子",
bg='#999999',
fg='white',
font=('黑體', 13),
justify='center',
height=5,
width=30,
anchor='n',
# wraplength=30
underline=3,
bd=3,
relief='flat'
)
#顯示出來(lái)
label.pack()
顯示效果
部分屬性介紹
-
anchor
: 文本在空間中的顯示位置(按上北下南, 左西右東規(guī)則), 可選值有(n北 e東 s南 w西 center居中 ne西北 se東南 sw西南 nw東北)方向 -
image
: 顯示的圖片
2. Button
控件
-
Button
控件是一個(gè)標(biāo)準(zhǔn)的Tkinter
小部件,用于各種按鈕, 如果用鼠標(biāo)點(diǎn)擊按鈕卵渴,可能會(huì)開(kāi)始一些操作 -
Button
可以顯示文本和圖片 - 按鈕只能以單一字體顯示文本, 文本可以跨越多行
# 設(shè)置標(biāo)題
window.title('Titanjun')
# 設(shè)置窗口大小
window.geometry('400x400')
# 創(chuàng)建按鈕
button1 = tkinter.Button(window,
text='按鈕1',
bg='orange',
height=3,
width=20,
bd=3,
relief='sunken',
activebackground='orange',
activeforeground='white',
command=action1
)
button1.pack()
button2 = tkinter.Button(window, text='Titanjun', height=3, command=window.quit())
button2.pack()
# 進(jìn)入消息循環(huán)
window.mainloop()
效果樣式
部分屬性介紹
-
activebackground
: 當(dāng)鼠標(biāo)放上去時(shí)慧域,按鈕的背景色 -
activeforeground
: 當(dāng)鼠標(biāo)放上去時(shí),按鈕的文本顏色 -
highlightcolor
: 要高亮的顏色 -
image
: 按鈕上要顯示的圖片 -
state
: 設(shè)置按鈕組件狀態(tài),可選的有(normal(默認(rèn)), active, disabled) -
command
: 按鈕的綁定函數(shù)方法, 接受一個(gè)函數(shù)名浪读,注意函數(shù)名不要加引號(hào)
3. Entry
輸入
輸入控件, 用于顯示簡(jiǎn)單的文本內(nèi)容, 和iOS
中的UITextField
一樣, 示例如下
vari = tkinter.Variable()
entry = tkinter.Entry(window, textvariable=vari)
entry.pack()
# 設(shè)置值
vari.set('very good')
# 取值
print(vari.get())
print(entry.get())
# 只讀輸入框
vari2 = tkinter.Variable()
entry2 = tkinter.Entry(window, textvariable=vari2, state='disabled')
entry2.pack()
# 設(shè)置值
vari2.set('very bad')
print(vari2.get())
# 密碼輸入框, 無(wú)論輸入什么都顯示密文
vari3 = tkinter.Variable()
entry3 = tkinter.Entry(window, textvariable=vari3, show='@', bg='red', fg='white')
entry3.pack()
效果樣式
監(jiān)聽(tīng)輸入框內(nèi)文字的改變
- 這里我們需要通過(guò)設(shè)置一下三個(gè)選項(xiàng)
-
validate
: 設(shè)置輸入框的監(jiān)聽(tīng)狀態(tài)-
focus
:當(dāng)Entry
組件獲得或失去焦點(diǎn)的時(shí)候驗(yàn)證 -
focusin
: 當(dāng)Entry
組件獲得焦點(diǎn)的時(shí)候驗(yàn)證 -
focusout
: 當(dāng)Entry
組件失去焦點(diǎn)的時(shí)候驗(yàn)證 -
key
:當(dāng)輸入框被編輯的時(shí)候驗(yàn)證 -
all
: 當(dāng)出現(xiàn)上邊任何一種情況的時(shí)候驗(yàn)證
-
-
validatecommand
: 接受一個(gè)判斷輸入框內(nèi)的文字是否符合要求的函數(shù), 該函數(shù)只能返回 True 或 False 表示驗(yàn)證的結(jié)果 -
invalidcommand
: 指定的函數(shù)只有在validatecommand
的返回值為False
的時(shí)候才被調(diào)用
# 主窗口
import tkinter
# 驗(yàn)證輸入的文字
def varileText():
text = entry4.get()
if text == '1':
print('對(duì)嘍')
return True
print('錯(cuò)漏')
return False
#
def testInvaild():
print('invaildCommanf被調(diào)用')
return True
# 創(chuàng)建主窗口
window = tkinter.Tk()
# 設(shè)置標(biāo)題
window.title('Titanjun')
# 設(shè)置窗口大小
window.geometry('400x400')
# 驗(yàn)證輸入的內(nèi)容是否符合要求
vari4 = tkinter.Variable()
entry4 = tkinter.Entry(window, textvariable=vari4, validate='key', validatecommand=varileText, invalidcommand=testInvaild)
entry4.pack()
# 進(jìn)入消息循環(huán)
window.mainloop()
4. Text
多行文本
-
Text
文本組件用于顯示和處理多行文本昔榴。 - 在
Tkinter
的所有組件中,Text
組件顯得異常強(qiáng)大和靈活碘橘,它適用于處理多任務(wù) - 當(dāng)創(chuàng)建一個(gè)
Text
組件的時(shí)候里面是沒(méi)有內(nèi)容的互订。為了給其插入內(nèi)容,可以使用insert()
以及INSERT
或END
索引號(hào)
4-1. 插入文本/控件/圖片
text = Text(window, bg='yellow', width=40, height=10)
#INSERT索引表示在光標(biāo)處插入
text.insert(INSERT,'I Love')
#END索引號(hào)表示在最后插入
text.insert(END,' you')
text.pack()
def show():
print('好了, 你贏了')
# text還可以插入按鈕 圖片等
b1 = Button(text, text='點(diǎn)我點(diǎn)我', command=show)
# 在text創(chuàng)建組件的命令
text.window_create(INSERT, window=b1)
4-2. 索引值
-
Indexes
(索引)是用來(lái)指向Text
組件中文本的位置痘拆,跟python
的序列索引一樣仰禽,Text
的組件索引也是對(duì)應(yīng)實(shí)際字符之間的位置 - 值得注意的是: 行號(hào)以1開(kāi)始 列號(hào)以0開(kāi)始
- 例如: 2.4表示第2行第4列的字符
from tkinter import *
root = Tk()
text1=Text(root,width=30,height=3)
text1.insert(INSERT,'index的練習(xí)')
#1.2到1.5的范圍之間
print(text1.get(1.2,1.5))
4-3. Text中的Tags
Tags
通常用于改變Text組件中內(nèi)容的樣式和功能,你可以修改文本的字體纺蛆,尺寸和顏色吐葵,另外Tags
還允許你將文本、嵌入的組件和圖片與鍵盤(pán)相關(guān)聯(lián)桥氏,除了user-defined tags
(用戶自定義的Tags
)
text.insert(INSERT, '自定義標(biāo)簽的名字')
#第一個(gè)參數(shù)為自定義標(biāo)簽的名字
#第二個(gè)參數(shù)為設(shè)置的起始位置温峭,第三個(gè)參數(shù)為結(jié)束位置
#第四個(gè)參數(shù)為另一個(gè)位置
text.tag_add('tag1', '1.7', '1.12', '1.14')
#用tag_config函數(shù)來(lái)設(shè)置標(biāo)簽的屬性(這里不要用簡(jiǎn)寫(xiě), 否則報(bào)錯(cuò))
text.tag_config('tag1', font=17, background='blue', foreground='red')
# text.tag_config('tag1', bg='yellow', fg='red')
#新的tag會(huì)覆蓋舊的tag
4-4. 帶滾動(dòng)條
text = Text(window, bg='yellow', width=100, height=10)
# 添加右側(cè)滾動(dòng)條
scroll = Scrollbar()
# side放到窗體的那一側(cè) fill填充
scroll.pack(side=RIGHT, fill=Y)
text.pack(side=RIGHT, fill=Y)
# 兩者關(guān)聯(lián)
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
str = '''致橡樹(shù)--舒婷
..........此處省略N個(gè)字...........
'''
text.insert(INSERT, str)
效果樣式
5. Checkbutton多選按鈕
-
Checkbutton
可以表示兩種狀態(tài):On
和Off
,可以設(shè)置回調(diào)函數(shù)字支,每當(dāng)點(diǎn)擊此按鈕時(shí)回調(diào)函數(shù)被調(diào)用 - 這里有一個(gè)示例: 選擇不同的復(fù)選框, 會(huì)有不同的文本顯示
def update():
message = ''
if tag1.get() == True:
message += 'titan \n'
if tag2.get() == True:
message += 'jun \n'
if tag3.get() == True:
message += 'coder \n'
#清除text中的所有內(nèi)容
text.delete(0.0, END)
# 插入新的文本內(nèi)容
text.insert(INSERT, message)
# 要綁定的變量
tag1 = BooleanVar()
check1 = Checkbutton(window, text = 'Titan', variable = tag1, command = update)
check1.pack()
tag2 = BooleanVar()
check2 = Checkbutton(window, text = 'Juned', variable = tag2, command = update)
check2.pack()
tag3 = BooleanVar()
check3 = Checkbutton(window, text = 'Coder', variable = tag3, command = update)
check3.pack()
text = Text(window, bg = 'orange', width = 50, height = 5)
text.pack()
效果樣式
[圖片上傳失敗...(image-fbcbfa-1543211943603)]
6. Radiobutton單選框
Radiobutton
為單選按鈕凤藏,即在同一組內(nèi)只能有一個(gè)按鈕被選中,每當(dāng)選中組內(nèi)的一個(gè)按鈕時(shí)堕伪,其它的按鈕自動(dòng)改為非選中態(tài)揖庄,與其他控件不同的是:它有組的概念
def selectorAction():
print(tag.get())
# 一組單選框要綁定同一個(gè)變量
tag = IntVar()
radio1 = Radiobutton(window, text = 'one', value = 23, variable = tag, command = selectorAction)
radio1.pack()
radio2 = Radiobutton(window, text = 'two', value = 32, variable = tag, command = selectorAction)
radio2.pack()
radio3 = Radiobutton(window, text = 'ten', value = 10, variable = tag, command = selectorAction)
radio3.pack()
效果樣式
未完待續(xù), 后期會(huì)繼續(xù)更新其他控件的相關(guān)介紹..........