Python 編程之Tkinter的使用01

Snip20180620_1.png
  • 原文博客鏈接地址
  • Python提供了多個(gè)圖形開(kāi)發(fā)界面的庫(kù)基跑,幾個(gè)常用Python GUI庫(kù)如下:
  • TkinterTkinter模塊(Tk 接口)是Python的標(biāo)準(zhǔn) Tk GUI 工具包的接口.TkTkinter可以在大多數(shù)的Unix平臺(tái)下使用, 同樣可以應(yīng)用在WindowsMacintosh系統(tǒng)里可款。Tk8.0的后續(xù)版本可以實(shí)現(xiàn)本地窗口風(fēng)格,并良好地運(yùn)行在絕大多數(shù)平臺(tái)中耿战。
  • wxPythonwxPython是一款開(kāi)源軟件囱晴,是Python語(yǔ)言的一套優(yōu)秀的GUI圖形庫(kù)详囤,允許Python程序員很方便的創(chuàng)建完整的霜定、功能健全的GUI用戶界面噩翠。
  • JythonJython程序可以和Java無(wú)縫集成巡球。除了一些標(biāo)準(zhǔn)模塊言沐,Jython使用Java的模塊邓嘹。Jython 幾乎擁有標(biāo)準(zhǔn)的Python中不依賴于C 語(yǔ)言的全部模塊。比如险胰,Jython的用戶界面將使用 Swing汹押,AWT或者SWTJython 可以被動(dòng)態(tài)或靜態(tài)地編譯成Java字節(jié)碼

一. Tkinter介紹

  • TkinterPython的標(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. 主窗口

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

效果如下

Snip20180620_5.png

主窗口除了上述方法之外還有以下方法

# 框體大小的可調(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()

顯示效果

Label效果.png

部分屬性介紹

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

效果樣式

Python按鈕.png

部分屬性介紹

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

效果樣式

Python輸入框.png

監(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()以及INSERTEND索引號(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)

效果樣式

滾動(dòng)Text.png

5. Checkbutton多選按鈕

  • Checkbutton可以表示兩種狀態(tài):OnOff,可以設(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()

效果樣式

python單選框.png

未完待續(xù), 后期會(huì)繼續(xù)更新其他控件的相關(guān)介紹..........


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市欠雌,隨后出現(xiàn)的幾起案子蹄梢,更是在濱河造成了極大的恐慌,老刑警劉巖富俄,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禁炒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛙酪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)翘盖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桂塞,“玉大人,你說(shuō)我怎么就攤上這事馍驯「笪#” “怎么了玛痊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狂打。 經(jīng)常有香客問(wèn)我擂煞,道長(zhǎng),這世上最難降的妖魔是什么趴乡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任对省,我火速辦了婚禮,結(jié)果婚禮上晾捏,老公的妹妹穿的比我還像新娘蒿涎。我一直安慰自己,他們只是感情好惦辛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布劳秋。 她就那樣靜靜地躺著,像睡著了一般胖齐。 火紅的嫁衣襯著肌膚如雪玻淑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天呀伙,我揣著相機(jī)與錄音补履,去河邊找鬼。 笑死区匠,一個(gè)胖子當(dāng)著我的面吹牛干像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驰弄,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼麻汰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了戚篙?” 一聲冷哼從身側(cè)響起五鲫,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岔擂,沒(méi)想到半個(gè)月后位喂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乱灵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年塑崖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痛倚。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡规婆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抒蚜,我是刑警寧澤掘鄙,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站嗡髓,受9級(jí)特大地震影響操漠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饿这,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一浊伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛹稍,春花似錦绣版、人聲如沸园蝠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至奉芦,卻和暖如春赵抢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背声功。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工烦却, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人先巴。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓其爵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伸蚯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摩渺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容