1. 程式人生 > 程式設計 >Python GUI程式設計學習筆記之tkinter控制元件的介紹及基本使用方法詳解

Python GUI程式設計學習筆記之tkinter控制元件的介紹及基本使用方法詳解

本文例項講述了Python GUI程式設計學習筆記之tkinter控制元件的介紹及基本使用方法。分享給大家供大家參考,具體如下:

相關內容:

  • tkinter的使用
    • 1.模組的匯入
    • 2.使用
    • 3.控制元件介紹
      • Tk
      • Button
      • Label
      • Frame
      • Toplevel
      • Menu
      • Menubutton
      • Canvas
      • Entry
      • Message
      • Text
      • Listbox
      • Checkbutton
      • Radiobutton
      • Scale
      • Scrollbar

首發時間:2018-03-04 16:39

Python的GUI各有各特點。

由於只是輕微涉及GUI開發,所以就以輕量級的tkinter來學習。

tkinter的使用:

  • 1.模組的匯入

    • [tkinter是python預設的gui庫,所以一般不需要另外安裝模組]:from tkinter import *
  • 2.使用:

    • 建立主視窗:root=Tk() 【root是一個主視窗物件】
    • 建立若干個控制元件:控制元件物件=控制元件(root,控制元件引數設定) 【這裡的控制元件也可以新增到其他視窗中】
    • 將控制元件顯示出來:控制元件物件.pack() 【這裡也不一定是pack,也可以是其他的顯示方式,比如grid,後面介紹】
    • 讓主視窗持續顯示:root.mainloop()
  • 3.控制元件介紹:

    • 主視窗Tk[所有控制元件都需要附著在介面上]:

      • 介紹:主視窗是所有控制元件附著的基礎,所有控制元件都需要附著在介面上,如果程式中沒有指定控制元件附著的視窗,將預設附著到主視窗Tk中,如果程式中沒有定義Tk,那麼將自動建立一個
      • 常見屬性【想要初始化主視窗的屬性需要使用 主視窗物件.屬性(“引數”) :
        • title:視窗標題
        • geometry:視窗大小,大寫格式是”寬度x高度+x位置+y位置”【注意不是*是x】,其中x,y將左上角作為(0,0)
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('500x500')
root.mainloop()
  • 按鈕Button:

    • 介紹:按鈕image
    • 常用引數設定【可以在建立按鈕的時候指定,也可以建立後使用 按鈕物件.config() 來設定】:
      • text:按鈕上的文字顯示
      • anchor:按鈕上內容的位置[取值:n,ne,e,se,s,sw,w,nw,or center,其中n e s w是東南西北的縮寫]
      • cursor:當滑鼠移動到按鈕上時所顯示的游標【arrow:箭頭,cross:十字,dot: 點,hand1:手 …….】
      • font:字型,使用元組來指定一個字型,這個元組包含了一個字型型別名字,一個以磅為單位的高度,代表一個或多個樣式的字串,比如("Times",10,"bold")
      • background[可縮寫為bg]:背景色,取值可未英文顏色字串,或者RGB值
      • foreground[可縮寫為fg]:前景色,取值可未英文顏色字串,或者RGB值
      • borderwidth[可縮寫為bd]::邊框大小
      • activebackground:按鈕處於活動狀態時使用的背景顏色。
      • activeforeground:按鈕處於活動狀態時使用的前景顏色。
      • disabledforeground:禁用按鈕時使用的顏色。
      • highlightbackground:當按鈕沒有焦點時用於高亮邊框的顏色
      • relief:邊框的裝飾
        • 列表裡面是relief的可選值:["flat","raised","sunken","solid","ridge","groove"]
        • flat是指按鈕邊框是平坦的,raise是指按鈕邊框是凸起的,sunken是指按鈕邊框是凹入的,solid是指按鈕邊框是粗邊框…
        • 按鈕relief的效果:image
      • padx和pady:指定文字或圖象與按鈕邊框的間距,x,y為x軸,y軸方向
      • height,widht:按鈕的尺寸,height為高度,width為寬度,如果不設定則預設為包括文字內容
      • state:按鈕的狀態,可取值:NORMAL,ACTIVE 或 DISABLED。預設值為NORMAL。
      • justify:對齊方式
      • command:當按下按鈕時呼叫的方法

Button所有的可設定引數

activebackground,activeforeground,anchor,background,bitmap,borderwidth,cursor,disabledforeground,font,foreground
highlightbackground,highlightcolor,highlightthickness,image,justify,padx,pady,relief,repeatdelay,repeatinterval,takefocus,text,textvariable,underline,wraplength

WIDGET-SPECIFIC OPTIONS【特有選項】: command,compound,default,height,overrelief,state,width

from tkinter import *

def hello():
 print("hello")
root=Tk()

# RELIEF=["flat","groove"]

btn1=Button(root,text='click me')
btn1.config(bg='green',fg='white',cursor='hand1',height=10,width=10,command=hello,relief='sunken')
btn1.config(anchor=LEFT)
btn1.pack()

# for col,i in enumerate(RELIEF):
#  btn=Button(root,text=i,relief=i,anchor=S)
#  btn.grid(row=0,column=col)

root.mainloop()
  • Label:

    • 介紹:顯示一個文字或圖象。
    • 引數設定:label沒有什麼特別的引數,可用引數參考下面的可用引數,再可以參考Button的引數設定
STANDARD OPTIONS【label的標準可選引數】

 activebackground,foreground,highlightbackground,wraplength
WIDGET-SPECIFIC OPTIONS【特有選項】:

 height,width
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('500x500')

label=Label(text='使用者名稱:',bg='green')
label.grid()
root.mainloop()

image

  • 框架Frame:

    • 介紹:一個容器視窗部件。可以有邊框和背景。Frame預設是沒有大小的,所以必須要設定高度和寬度,而當加了控制元件到Frame後它會“縮水”【這裡縮水是因為Frame自動縮小到剛好能包裹控制元件】,需要在顯示的時候強制設定大小比如pack(fill=X),這是強制填充水平方向,又或者使用 Frame物件.pack_propagate(0),這個函式可以使得設定的高度和寬度生效
    • 引數設定:可用引數參考下面的可用引數,再參考按鈕的引數設定
STANDARD OPTIONS【標準可用引數】

 activebackground,wraplength
#這是一段沒有顯示Frame 程式碼
from tkinter import *

root=Tk()
root.geometry('500x500')
frame=Frame(root,height = 200,width = 400,bg = 'black')

Label(frame,text='mylabel').pack()

frame.pack()

root.mainloop()
#下面是探究出縮水原因的程式碼
from tkinter import *

root=Tk()
root.geometry('500x500')
frame=Frame(root,height = 400,bg = 'green')


button1=Button(frame,text='hello')
button1.pack(side=LEFT,padx=5,pady=5)#增加了邊距之後,發現出了frame的背景顏色
button2=Button(frame,text='hello')
button2.pack(side=LEFT)
frame.pack(side=TOP)


root.mainloop()

image

#下面的是使用.pack_propagate(0)解決了問題的程式碼
from tkinter import *

root=Tk()
root.geometry('500x500')
frame=Frame(root,bg = 'green')

# Label(frame,text='mylabel',pady=5).pack(side=LEFT)
button1=Button(frame,pady=5)
button2=Button(frame,text='hello')
button2.pack(side=LEFT)
frame.pack_propagate(0)
frame.pack(side=TOP)

# frame.pack(side=TOP,fill=X)

root.mainloop()
  • Toplevel:

    • 介紹:一個容器視窗,作為一個單獨的、最上面的視窗顯示。 image
    • 引數設定:可用引數參考下面的,用法參考Tk的
    • Toplevel是一個子視窗,當父視窗關閉時子視窗會關閉,但子視窗關閉時父視窗不關閉
Valid resource names: 
background,bd,bg,class,colormap,container,menu,screen,use,visual,width
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('500x500')

t1=Toplevel(root)
t1.title("Top視窗")
t1.geometry("100x100")
label=Label(t1,text="使用者名稱:")
label.pack()
root.mainloop()
  • 選單Menu:

    • 介紹:選單控制元件,相當於一個選單組\選單欄,沒有新增其他選單時預設沒有顯示,只有新增其他的選單,才會了實際的意義
    • 要想顯示選單,必須在“要新增選單的視窗物件”的config中允許新增上“選單物件”image
    • 引數設定:可用引數參考下面的可用引數,再參考按鈕的引數設定
      • 注意:Menu是沒有text的
    • 新增選單按鈕:
      • 新增命令選單:Menu物件.add_command()
      • 新增多級選單:Menu物件.add_cascade(**options) 【多級選單可以傳入一個選單物件】image
      • 新增分割線:Menu物件.add_separator(**options)
      • 新增複選框選單:Menu物件.add_checkbutton(**options)
      • 新增單選框選單:Menu物件.add_radiobutton(**options)
      • 插入選單:insert_separator(),insert_checkbutton(),insert_radiobutton(),insert_cascade(),
      • 其他。。。。
常見可用引數:
activebackground,activeborderwidth,fg,postcommand,selectcolor,tearoff,tearoffcommand,title,type
from tkinter import *

root=Tk()

menuBar=Menu(root,tearoff=0)
root.config(menu=menuBar)
filemenu=Menu(menuBar,fg='green')#檔案選單下的字型是綠色的
filemenu.add_command(label='新建',accelerator = 'Ctrl+N')
filemenu.add_command(label='開啟',accelerator = 'Ctrl+O')
filemenu.add_command(label='儲存',accelerator = 'Ctrl+S')
filemenu.add_command(label='另存為',accelerator ='Ctrl+Shift+S')
menuBar.add_cascade(label='檔案',menu=filemenu)

#這裡測試root.config(menu=menuBar)的作用
# def show_menuBar():
#  root.config(menu=menuBar)
# button=Button(text='show_menu',command=show_menuBar)
# button.pack()


root.mainloop()
  • Menubutton:

    • 介紹:選單按鈕。用來實現下拉式選單。 image
    • 引數設定:可用引數參考上面Menu的,用法同樣可以參考按鈕Button的
    • 新增選單的方法參考Menu的
    • 注意:這次不是在root裡面config了,而是在選單按鈕中設定
from tkinter import *
root=Tk()
menubtn=Menubutton(root,text='單擊出現下拉選單',relief='raise')#建立一個選單按鈕
menubtn.pack()
#新增選單
filemenu=Menu(menubtn)
filemenu.add_command(label='新建')

menubtn.config(menu=filemenu)#設定選單按鈕允許顯示選單,這裡不是root了
root.mainloop()

  • Canvas:

    • 介紹:組織圖形。這個部件可以用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件
    • 引數設定:可用引數參考下面的,用法同樣可以參考按鈕Button的
    • 新增影象的方法:
      • create_rectangle:根據四個引數畫一個矩形,四個引數是位置
      • create_polygon:根據提供的多個引數畫一個多邊形
      • 其他。。
可用引數: background,closeenough,confine,insertbackground,insertborderwidth,insertofftime,insertontime,insertwidth,offset,scrollregion,selectbackground,selectborderwidth,selectforeground,width,xscrollcommand,xscrollincrement,yscrollcommand,yscrollincrement
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('500x500')
mycanvas=Canvas(root,width=200,height=200,bg='green')
mycanvas.pack()
#畫一個矩形
mycanvas.create_rectangle(10,110,outline = 'red',width = 5)

root.mainloop()
  • Entry:

    • 介紹:單行文字輸入域。 image
    • 引數設定:可用引數參考下面的,用法同樣可以參考按鈕Button的
Valid resource names: background,exportselection,invalidcommand,invcmd,show,validate,validatecommand,vcmd,xscrollcommand.
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('300x300+20+10')
entry=Entry(root)
entry.pack()

root.mainloop()
  • Text:

    • 介紹:多行文字輸入域,允許你用不同的樣式和屬性來顯示和編輯文字。同時支援內嵌圖象和視窗。 image
    • 引數設定:可用引數參考下面的,用法同樣可以參考按鈕Button的
STANDARD OPTIONS

 background,setgrid,WIDGET-SPECIFIC OPTIONS

 autoseparators,maxundo,spacing1,spacing2,spacing3,tabs,undo,wrap,
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('300x300+250+55')
button=Button(text='submit')
button.pack()
t1=Text(root,height=100,width=100,cursor='cross')
t1.pack()

root.mainloop()
  • Message:

  • 介紹:顯示多行文字。類似label視窗部件,但是能夠自動地調整文字到給定的寬度或比率。 image
  • 引數設定:與Label類似
  • 由於Label也可以顯示多行文字後,就逐漸少用Message了。"""Message widget to display multiline text. Obsolete since Label does it too."""
  • Listbox:

    • 介紹:列表框用於從一組文字專案中進行選擇。 根據列表框的配置方式,使用者可以從列表中選擇一個或多個專案。image
    • 引數設定:可用引數參考下面的,引數設定同樣可以參考按鈕Button的
      • selectmode:選擇模式,selectmode=EXTENDED時允許多選
      • selectbackground:選中時的背景顏色
      • selectforeground:選中時的字型顏色
      • selectborderwidth:選中時的邊框大小
    • 常用函式:
      • 插入:insert(索引,元素)
      • 刪除:delete(索引,元素)
      • 獲取listbox元素:get()
Valid resource names: background,selectmode,listvariable
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('300x300+20+10')
# listbox=Listbox(root)
listbox=Listbox(root,selectmode=EXTENDED)
listbox.insert(0,"孫悟空")
listbox.insert(1,"唐僧")
listbox.insert(2,"葫蘆娃")
listbox.pack()
def func1():
 print(listbox.get(0,END))#以元組形式返回所有listbox的元素
def func2():
 print(listbox.select_includes(1))#當對應索引被選中時返回True
def func3():
 print(listbox.curselection())#以元組形式返回被選中的元素

btn1=Button(text="獲取所有元素",command=func1)
btn1.pack()
btn2=Button(text="判斷1是否選中",command=func2)
btn2.pack()
btn3=Button(text="獲取選中的索引",command=func3)
btn3.pack()


root.mainloop()
  • 複選框Checkbutton:

    • 介紹:複選框點選這個按鈕將會在這兩個值間切換。
    • 引數設定:可用引數參考下面的,用法同樣可以參考按鈕Button的
      • variable:值為tkinter變數,可以使用 tkinter變數.get方法 來獲取是否選中
    • 如果想要獲取選中值,必須設定一個tkinter變數來獲取,tkinter變數型別有:BooleanVar,DoubleVar,IntVar,StringVar
可用引數:activebackground,command,indicatoron,offvalue,onvalue,selectimage,variable,wraplength
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('200x200')
def submit():
 print('男:',v1.get(),'女:',v2.get(),'另外:',v3.get())#選擇則值為1,不選中為0
 # pass


v1 = IntVar()   #用tkinter變數來表示按鈕是否選中
v2 = IntVar()
v3 = IntVar()
# 使用 Checkbutton時,必須建立一個 Tkinter 變數用於存放按鈕的狀態:
cbtn=Checkbutton(root,text='男',variable=v1,command=submit)
cbtn2=Checkbutton(root,text='女',variable=v2,command=submit)
#v3是為了測試variable相同時,點一個,所有的v3都被選中
cbtn3=Checkbutton(root,text='不明',variable=v3,command=submit)
cbtn4=Checkbutton(root,text='保密',command=submit)

button=Button(text='submit',command=submit)
button.pack()
cbtn.pack()
cbtn2.pack()
cbtn3.pack()
cbtn4.pack()
root.mainloop()
  • Radiobutton:

    • 介紹:代表一個變數,它可以有多個值中的一個。點選它將為這個變數設定值,並且清除與這同一變數相關的其它radiobutton。
    • 引數設定:可用引數參考下面的,用法同樣可以參考按鈕Button的
      • variable:值為tkinter變數,可以使用 tkinter變數.get方法 來獲取是否選中
      • value:根據前面的variable來決定資料型別,使用 tkinter變數.get方法 此時獲取的是選中選項的value的值
Valid resource names: activebackground,value,wraplength
from tkinter import *

root=Tk()
v=StringVar()
l=['man','woman','unknow']
def ptr():
 print(v.get())
for i in l:
 rbtn=Radiobutton(root,variable=v,value=i,command=ptr)
 rbtn.pack()

root.mainloop()
  • Scale:

      介紹:允許你通過滑塊來設定一數字值。
    • 介紹:允許你通過滑塊來設定一數字值。 image
    • 常用引數設定:
      • from_:設定滑塊起始值
      • to:設定滑塊最大值
      • orient:設定方向,預設是豎的,如果想改成水平的:orient=HORIZONTAL
Valid resource names: 
activebackground,bigincrement,digits,from,label,length,orient,resolution,showvalue,sliderlength,sliderrelief,tickinterval,to,troughcolor,width
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('300x300+20+10')
scale=Scale(root,from_=0,to=100)#預設是豎的
scale2=Scale(root,to=100,orient=HORIZONTAL)#橫的
scale.pack()
scale2.pack()

root.mainloop()
  • Scrollbar:

    • 介紹:為配合使用canvas,entry,listbox,and text視窗部件的標準滾動條。
    • 引數設定:可用引數參考下面的,用法參考按鈕Button的
Valid resource names: 
activebackground,activerelief,elementborderwidth,jump,width.
from tkinter import *

root=Tk()
root.title('我的視窗')
root.geometry('300x300+250+55')
button=Button(text='submit')
button.pack()
t1=Text(root,cursor='cross')

slb=Scrollbar(root)
slb.pack(side=RIGHT,fill=Y)#設定滾動條的顯示形式
t1.config(yscrollcommand=slb.set)#設定允許滾動條
#由於沒有繫結事件,所以直接拖拽滾動條無效

t1.pack()
root.mainloop()

想要了解更多,可以參考tkinter的官方文件:http://effbot.org/tkinterbook/

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python資料結構與演算法教程》、《Python Socket程式設計技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。