<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python圖形用戶界GUI大解密(上篇)

          共 10956字,需瀏覽 22分鐘

           ·

          2021-06-04 00:44

          點(diǎn)擊上方“Python爬蟲(chóng)與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書(shū)

          君不見(jiàn)吳中張翰稱達(dá)生,秋風(fēng)忽憶江東行。

          在我們平時(shí)寫代碼的時(shí)候,為了讓程序效果顯得更直觀,我們通常都會(huì)給它們套上一層美麗的外衣,這層外衣便是-------GUI,中文名又叫,圖形用戶接口,能起到很好的交互作用。下面我們來(lái)著重介紹下Python中自帶的GUI模塊-----tkinter,看看它有哪些豐富的圖形接口吧。

          1.安裝并導(dǎo)入

          哦,tkinter庫(kù)系統(tǒng)自帶,無(wú)需安裝,直接導(dǎo)入即可:

          import tkinter  as tk  # 因?yàn)樗容^長(zhǎng),所以給它個(gè)簡(jiǎn)寫的方式 ,用tk代表它。

          2.實(shí)例化窗口

          root= tk.Tk()            #主窗口root.title('hello')   #窗口標(biāo)題root.geometry('400x500')  #窗口尺寸root.wm_minsize(140, 170) # 設(shè)置窗口最小化大小root.wm_maxsize(1440, 2800)             # 設(shè)置窗口最大化大小root.iconbitmap('1.ico')   #窗口圖標(biāo) 必須是ico格式的圖片root.resizable(width=False, height=True)     # 設(shè)置窗口寬度不可變,高度可變root.mainloop() #主窗口循環(huán)顯示

          我們的第一個(gè)窗口就這樣應(yīng)運(yùn)而生了,另外它還有許多其它功能,比如:

          root.quit()    #退出root.destroy() #銷毀root.update() #刷新 可以接收用戶改變程序進(jìn)程root.update_idletasks()  #刷新 不能接收用戶改變程序進(jìn)程root.wm_title('i love you')  #最小化顯示字樣root.configure(background='blue') #背景顏色

          下面我們?cè)俳o它添加點(diǎn)別的部件和功能吧。


          3.基本部件

          tkinter里面有很多豐富的部件,有標(biāo)簽,文本框,列表框,下拉列表框,多選框,單選框等等,下面我們一起認(rèn)識(shí)下它們吧。

          一、標(biāo)簽

          它是tkinter里面的標(biāo)簽部件,主要用于提示。那么它有哪些有趣的功能呢?一起看一下:

          label=tk.Label(root,           text='Hello', #標(biāo)簽內(nèi)文本         bg='red',      #背景顏色         font=('Arial',20), #字體和字體大小         width=10,  #文本寬度         height=5   #文本高度        )

          不過(guò)我們光這樣標(biāo)簽還不會(huì)添加到我們的主界面中,還得給它進(jìn)行下一步操作:

          label.pack() #添加部件到主界面

          下面看下效果:

          這樣我們就成功將它添加進(jìn)來(lái)了,有點(diǎn)丑,等會(huì)我們?cè)僮鲂薷摹4蠹铱梢钥吹浆F(xiàn)在的標(biāo)簽里的值是靜態(tài)無(wú)法修改的,那要是我們想讓它動(dòng)態(tài)變更了,那我們可以這樣做:

          這樣就達(dá)到了修改標(biāo)簽的值的功能。

          關(guān)于標(biāo)簽還有許多優(yōu)秀的方法,比如說(shuō):

          label.configure(text) #重新設(shè)置標(biāo)簽文本 得是text的時(shí)候設(shè)置才生效label.configure(background='blue')  #重新設(shè)置標(biāo)簽背景

          標(biāo)簽的屬性總共有下面幾種:

          anchor              文本位置;background(bg)     背景色;    foreground(fg)      前景色;    borderwidth(bd)     邊框?qū)挾龋?/span>    width             標(biāo)簽寬度;    height            標(biāo)簽高度;    bitmap             標(biāo)簽中的位圖;    font               字體;    image             標(biāo)簽中的圖片;    justify            多行文本的對(duì)齊方式;    text             標(biāo)簽中的文本,可以使用'\n'表示換行    textvariable       顯示文本自動(dòng)更新,與StringVar等配合著用

          二、按鈕

          按鈕的功能主要是實(shí)現(xiàn)點(diǎn)擊功能,比如說(shuō)確認(rèn),提交操作。那么它有哪些操作呢?

          可以看出,成功實(shí)現(xiàn)了點(diǎn)擊事件,而且我們可以通過(guò)點(diǎn)擊按鈕來(lái)改變標(biāo)簽的值,下面來(lái)看看:

          可以看出,成功的改變了值和背景顏色。大家可能對(duì)上圖中的side='left'有點(diǎn)不理解,其實(shí)那個(gè)就是確定組件位置的,一個(gè)左一個(gè)右。按鈕還有一個(gè)隱藏和顯示的功能也是相當(dāng)好實(shí)現(xiàn)的:

          button.pack          #顯示button.pack_forget   #隱藏

          關(guān)于button還有以下方法供大家學(xué)習(xí):

              anchor              文本位置;
          background(bg)     按鈕的背景色;
            bitmap:            按鈕上顯示的位圖;
            borderwidth(bd)    按鈕邊框的寬度;
            command:         按鈕消息的回調(diào)函數(shù);
            cursor:           鼠標(biāo)移動(dòng)到按鈕上的指針樣式;
            font:              按鈕上文本的字體;
            foreground(fg)     按鈕的前景色;
            height:           按鈕的高度;
            image:            按鈕上顯示的圖片;
            state:             按鈕的狀態(tài)(disabled);
            text:               按鈕上顯示的文本;
            width:            按鈕的寬度
            padx              設(shè)置文本與按鈕邊框x的距離,還有pady;
            activeforeground    按下時(shí)前景色
            textvariable        可變文本,與StringVar等配合著用


          三、文本框,多行文本框

          之所以拿來(lái)一起講,是因?yàn)樗鼈兒芏鄥?shù)都是一樣的,所以沒(méi)必要分開(kāi)講,我們先來(lái)說(shuō)說(shuō)文本框:

          1.文本框

          用來(lái)接受用戶輸入,常用來(lái)登陸賬號(hào)和密碼。

          可以看到一個(gè)顯示為漢字,另一個(gè)則是?,這就是它的明文和密文設(shè)置了。我們還可以獲取到它里面的值用來(lái)校驗(yàn)數(shù)據(jù)庫(kù)中的信息以便登陸,不過(guò)這里我們只把它打印出來(lái)即可。

          完美將它打印了出來(lái),小伙伴們看到這里是不是可以寫個(gè)登陸系統(tǒng)嘞。單行文本框自定義插入值:

          e1.insert(index,string) #在指定索引位置插入字符串

          2.多行文本框

          與文本框不同的是,它可以顯示多行信息,一般用來(lái)顯示某些結(jié)果。

          可以看到,多行文本就是這樣的,我們可以給它插入文本:

          tt.insert('insert','你是豬嗎')  #首行插入tt.insert('current','我是豬')   #當(dāng)前插入tt.insert('end','123')         #末尾插入


          除了插入還可以刪除:

          tt.delete('1.0',tk.END) #刪除文本框所有內(nèi)容

          另外文本框有時(shí)候需要實(shí)時(shí)更新內(nèi)容,所以還有一個(gè)方法:

          tt.update()  #更新多行文本框內(nèi)容

          除此之外,我們還可以在多行文本框中添加其它組件實(shí)現(xiàn)一些功能。

          1.記住密碼功能

          2.照片查看器

          我們需要認(rèn)識(shí)一個(gè)新的方法,它叫PhotoImage。它的設(shè)計(jì)比較古怪,個(gè)人覺(jué)得,因?yàn)樗恢С謌if圖片。

          通過(guò)上面的設(shè)置創(chuàng)建了一個(gè)window執(zhí)行函數(shù),在實(shí)際應(yīng)用中可以用它來(lái)實(shí)現(xiàn)記住密碼和查看gif照片的功能。

          關(guān)于文本框和多行文本框就說(shuō)到這里,它們還有很多其它的方法:

          指定位置插入值:
          tt.mark_set("here","3.2") #建立mark,相當(dāng)于索引,第三行第二列tt.insert('here',"hello") #插入hellott.mark_unset('here') #刪除mark
          高亮顯示文本:
          tt.tag_add('tag1','1.3','2.1','2.2') #設(shè)置要設(shè)置樣式的區(qū)域tt.tag_config("tag1",background="green",foreground="blue")tt.tag_config("tag2",background="blue",foreground="red")#如設(shè)置多個(gè)樣式則新樣式覆蓋舊樣式tt.tag_lower("tag1")  #可通過(guò)tagraise()和tag_lower()方法來(lái)提高和降低某個(gè)Tag的優(yōu)先級(jí)
          獲取多行文本框的值:
          tt.get('0.0','end')
          文本綁定鼠標(biāo)事件:
          tt.tag_add("link","2.1","2.5")tt.tag_config("link",foreground="blue",underline=True) #選中的內(nèi)容添加下劃線 藍(lán)色背景顏色def show_1(event):     tt.config(cursor="arrow") #鼠標(biāo)箭頭型def show_2(event):     tt.config(cursor="xterm")  #鼠標(biāo)I型def click(event):     print('我被單擊了')tt.tag_bind("link","<Enter>",show_1)tt.tag_bind("link","<Leave>",show_2)tt.tag_bind("link","<Button-1>",click)

          恢復(fù),撤銷:
          tt.edit_undo() #撤銷tt.editredo()  #恢復(fù)
          更多精彩內(nèi)容:
          background(bg)      文本框背景色;foreground(fg)        前景色;selectbackground    選定文本背景色;selectforeground    選定文本前景色;borderwidth(bd)      文本框邊框?qū)挾龋?/span>font                 字體;show                文本框顯示的字符,若為*,表示文本框?yàn)槊艽a框;state               狀態(tài);width              文本框?qū)挾?/span>textvariable        可變文本,與StringVar等配合著用

          四、單選框,復(fù)選框

          這個(gè)我們平時(shí)勾選答案是單選還是多選時(shí)很常見(jiàn)。下面讓我們來(lái)看看吧:

          1.單選框Radiobutton

          2.復(fù)選框Checkbutton

          可以看出,做出來(lái)了,不過(guò)有點(diǎn)復(fù)雜,因?yàn)闆](méi)有善用循環(huán),下面給出一種簡(jiǎn)單的寫法:

          可以看到,幾行代碼就把四個(gè)控件列出來(lái)了。關(guān)于單選框多選框還有很多有趣的方法:

          anchor           文本位置;background(bg)   背景色;foreground(fg)    前景色;borderwidth       邊框?qū)挾龋?/span>width            組件的寬度;height           組件高度;bitmap           組件中的位圖;image            組件中的圖片;font             字體;justify          組件中多行文本的對(duì)齊方式;text             指定組件的文本;value            指定組件被選中中關(guān)聯(lián)變量的值;variable          指定組件所關(guān)聯(lián)的變量;indicatoron        特殊控制參數(shù),當(dāng)為0時(shí),組件會(huì)被繪制成按鈕形式;textvariable       可變文本顯示,與StringVar等配合著用

          五、listbox列表

          列表常用于選擇選項(xiàng)。

          這個(gè)比較簡(jiǎn)單,沒(méi)什么好說(shuō)的。


          六、滑塊條,滾動(dòng)條

          1.滑塊條

          一行代碼就能搞定了,也是非常簡(jiǎn)單:

          默認(rèn)方向?yàn)榇怪?,只需將orient屬性設(shè)為horizontal(tk.HORIZONTAL )即可,也可設(shè)為垂直:orient="vertical"


          2.滾動(dòng)條

          常和其它組件配套使用,比如列表框,多行文本框。安裝滾動(dòng)條之前需要做兩件事情。

          1.指定該組件的yscrollbarcommand參數(shù)為Scrollbar的set()方法

          2.指定Scrollbar 的 command 參數(shù)為該組件的 yview() 方法

          由于滾動(dòng)條一般都是垂直方向,所以我們不改動(dòng)它的方向。

          可以看到,我們的滾動(dòng)條和列表組件產(chǎn)生了聯(lián)系,滾動(dòng)條滾動(dòng)列表內(nèi)容相應(yīng)往下翻,如果你要想設(shè)置滾動(dòng)條的位置,只需:

          sl.set(0.5,1) #使?jié)L動(dòng)條始終保持在中間位置

          滾動(dòng)條和滑塊條一樣,都比較簡(jiǎn)單,項(xiàng)目中用的也不是蠻多,總體來(lái)說(shuō)比較簡(jiǎn)單的組件。


          七、畫布

          平時(shí)會(huì)用于繪制各種曲線和位圖,canvas可以很輕松創(chuàng)建各種有趣的圖形圖像。下面來(lái)了解下

          #初始化一個(gè)200x100的背景顏色為藍(lán)色的形狀canvas = tk.Canvas(root, bg='blue', height=100, width=200) 
          #創(chuàng)建一個(gè)矩形,背景色為綠色,邊框線顏色為紅色,線寬為2,虛線長(zhǎng)度為3,畫刷為gray12,jx=canvas.create_rectangle(100,100,50,50,fill='green',outline='red',width=2,dash=3,stipple = 'gray12')
          #繪制弧形 風(fēng)格為pieslice(chord扇形,拋物線arc) 起始角度0 角度偏移量180hx=canvas.create_arc(50, 100,140, 200,style='pieslice',start=0, extent=180)
          #創(chuàng)建直線 坐標(biāo)為100,100的長(zhǎng)度為200x200的直線,一頭有箭頭(none無(wú),last尾部,both兩端,箭頭形狀)zx=canvas.create_line(100, 100, 200, 200,arrow='first',arrowshape='30 20 10')
          #創(chuàng)建橢圓,背景色為redy=canvas.create_oval(50, 100,140, 200, fill='red')
          #創(chuàng)建多邊形 直角三角形dbx=canvas.create_polygon((150,150,150,200,70,200),fill = 'red')
          #創(chuàng)建文字 居中顯示wz=canvas.create_text((10,10),text = 'Hello Text',anchor ='w')canvas.select_from(wz,3) # 設(shè)置文本的選中開(kāi)始位置canvas.select_to(wz,7)# 設(shè)置文本的選中結(jié)束位置
          #創(chuàng)建位圖,類型為error(info信息,question問(wèn)題,hourglass沙漏)canvas.create_bitmap((40,40),bitmap = 'error')
          #創(chuàng)建gifimg= tk.PhotoImage(file='1.gif')canvas.create_image(10, 10, anchor='nw', image=img)
          #創(chuàng)建組件bt =tk.Button(canvas,text='hello',command)canvas.create_window((100,100),window=bt,anchor='w')
          #將jx移動(dòng)到另一區(qū)域cv.coords(jx,(10,10,20,20))
          #移動(dòng)圖形右移20個(gè)px,再返回canvas.move(jx,20,0)
          #刪除圖形canvas.delete(jx)
          #添加綁定事件,只有點(diǎn)擊到矩形邊框才有效canvas.tag_bind('jx','<Button-1>',command) #左鍵為1,右鍵為3,滾輪2

          canvas繪圖還是比較強(qiáng)大的,以上的知識(shí)點(diǎn)差不多夠平時(shí)用了,可以看到:

          八、下拉列表框

          一般用于某個(gè)功能的配套選擇,這個(gè)部件在tkinter中的ttk模塊下,和其它的不同,所以我們導(dǎo)入ttk:

          #打印下拉列表框的值from tkinter import  ttkdef function(*arg):    print(cb.get()) #獲取下拉列表框的值cb=ttk.Combobox(root, width=12,state='readonly')#下拉列表框?qū)挾葹?2 只讀cb['values'] = ('請(qǐng)選擇-----','1','2','3','4') #設(shè)置下拉列表框的內(nèi)容   cb.current(0)    #將當(dāng)前選擇狀態(tài)置為0,也就是第一項(xiàng)cb.bind("<<ComboboxSelected>>",function)  #綁定function函數(shù),然后觸發(fā)事件cb.pack()

          注:下拉列表沒(méi)有command參數(shù),但是它可以設(shè)置textvariable進(jìn)行參數(shù)傳遞。


          九、菜單欄,菜單按鈕,選項(xiàng)菜單

          先說(shuō)說(shuō)我們熟知的菜單(Menu),它主要我們?yōu)榱撕?jiǎn)化軟件的使用而建立的,避免添加過(guò)多的控件。那么它是如何建立的了,請(qǐng)看:

          1.下拉菜單

          #創(chuàng)建菜單欄m=tk.Menu(root)
          #定義一個(gè)父菜單file=tk.Menu(m,tearoff=False)
          #將上面定義的父菜單命名為File,放在菜單欄中m.add_cascade(label='文件', menu=file)
          #在File中加入下拉菜單,并添加對(duì)應(yīng)命令操作。#如果點(diǎn)擊這些選項(xiàng), 就會(huì)觸發(fā)相應(yīng)的功能file.add_command(label='新建',accelerator='Ctrl+N')file.add_command(label='打開(kāi)', accelerator='Ctrl+O')file.add_command(label='保存', accelerator='Ctrl+S')
          #添加一條分割線file.add_separator()file.add_command(label='退出',command=root.quit,accelerator='Ctrl+Q') edit= tk.Menu(m,tearoff=False)m.add_cascade(label='編輯', menu=edit)edit.add_command(label='剪切',accelerator='Ctrl+X')edit.add_command(label='復(fù)制',accelerator='Ctrl+C')edit.add_command(label='粘貼',accelerator='Ctrl+V') #二級(jí)菜單s= tk.Menu(file,tearoff=False)file.add_cascade(label='導(dǎo)入', menu=s)s.add_command(label="模塊")s.add_command(label="文本文件")
          #三級(jí)菜單z=tk.Menu(s,tearoff=False)s.add_cascade(label='圖片',menu=z)z.add_command(label="gif")z.add_command(label="jpg")z.add_command(label="png")z.add_command(label="bmp")root.configure(menu=m)

          2.右鍵彈出菜單

          在做這個(gè)之前我們要了解鼠標(biāo)綁定事件愛(ài)你,因?yàn)橛益I彈出需要擊鍵,所以我們需要了解它。

          既然是右鍵我們當(dāng)然得綁定右鍵了:

          root.bind("<Button-3>",function)

          然后我們書(shū)寫綁定函數(shù)并把它綁定到當(dāng)前對(duì)象中:

          def function(event):    m.post(event.x_root, event.y_root)  #可以替換菜單,變?yōu)槠渌藛危热缯f(shuō)s,z

          這樣就實(shí)現(xiàn)了右鍵彈出菜單的功能,是不是很簡(jiǎn)單了。關(guān)于菜單的操作還有許多,不一一演示,下面請(qǐng)看:

          #添加一個(gè)子菜單 coption為配置選項(xiàng)add_cascade(option)
          #添加一個(gè)切換按鈕 coption為配置選項(xiàng)add_checkbutton(option)
          #添加一個(gè)功能按鈕 coption為配置選項(xiàng)add_command(option)
          #添加一個(gè)單選按鈕 coption為配置選項(xiàng)add_radiobutton(option)
          #添加一個(gè)分割線add_separator()
          #刪除index1 到 index2之間的選項(xiàng)delete(index1,index2)
          #獲取菜單某一項(xiàng)的屬性值entrycget(index,coption)
          #重新配置菜單中某項(xiàng)的屬性entryconfigure(index,option)
          #返回參數(shù)位置對(duì)應(yīng)的選項(xiàng)索引index(i)
          #在指定位置插入一個(gè)子菜單insert_cascade(index,option)
          #在指定位置插入一個(gè)切換按鈕insert_checkbutton(index,option)
          #在指定位置插入一個(gè)功能按鈕insert_command(index,option)
          #在指定位置插入一個(gè)單選按鈕insert_radiobutton(index,option)
          #在指定位置插入一個(gè)分割線insert_separator(index)
          #代碼手動(dòng)調(diào)用一次某個(gè)選項(xiàng)invoke(index)
          #在窗口指定位置彈出菜單post(x,y)
          #獲取某個(gè)選項(xiàng)的類型type(index)
          #獲取某個(gè)選項(xiàng)距離菜單頂部的偏移量yposition(n)
          #添加一個(gè)選項(xiàng) 可以是功能按鈕,切換按鈕,單選按鈕或子菜單,由類型確認(rèn)#類型可選 cascade checkbutton command radiobutton separatoradd(kind,option)

          3.菜單按鈕

          它是與菜單相關(guān)聯(lián)的按鈕,可放在任意位置,下面來(lái)創(chuàng)建一個(gè)看看:

          def show(): #觸發(fā)事件    print("hello")mb = tk.Menubutton(root,text="python",relief=tk.RAISED) #菜單按鈕配置mb.pack()file = tk.Menu(mb,tearoff=0)  #添加菜單file.add_checkbutton(label="打開(kāi)",command=show) #添加確認(rèn)按鈕到菜單中file.add_command(label="保存",command=show) #添加保存命令file.add_separator() #添加分隔線file.add_command(label="退出",command=root.quit) #添加退出命令mb.configure(menu=file)  #將菜單按鈕配置添加到主菜單中


          4.選項(xiàng)菜單

          這個(gè)組件在一定程度上好比下拉菜單,又如listbox,下面我們來(lái)看下吧:

          var =tk.StringVar()var.set("編程語(yǔ)言") #設(shè)置菜單初始值o = tk.OptionMenu(root,var,"python","php","c#","c++") #將菜單選項(xiàng)加入到菜單中去o.pack()

          是不是覺(jué)得菜單比較有趣,通過(guò)對(duì)菜單的認(rèn)識(shí)你也可以做一個(gè)記事本或者其它小工具,其它方法如下:

          tearoff         分窗,0為在原窗,1為點(diǎn)擊分為兩個(gè)窗口,也可以是 True,F(xiàn)alsebg,fg           背景,前景borderwidth      邊框?qū)挾?/span>font              字體activebackgound  點(diǎn)擊時(shí)背景,有activeforeground,activeborderwidth,disabledforegroundcursor            選中菜單選項(xiàng)時(shí)的光標(biāo)形狀post               右鍵菜單selectcolor      選中時(shí)背景takefocus         使用 Tab 鍵獲取按鈕的焦點(diǎn) title              標(biāo)題type                類型relief              樣式"sunken","raised","groove","ridge" "flat"
          方法:m.add_cascade 添加子選項(xiàng)m.add_command 添加命令(label參數(shù)為顯示內(nèi)容)m.add_separator 添加分隔線m.add_checkbutton 添加確認(rèn)按鈕delete 刪除

          /總結(jié)/

          這篇文章著重介紹了Python中自帶的GUI模塊-----tkinter,由于內(nèi)容較多,上篇內(nèi)容主要介紹了其安裝、基本部件、下拉菜單、畫布等內(nèi)容,下篇文章我們繼續(xù)解密Python GUI的其他內(nèi)容。

          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~~

          瀏覽 96
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  第一页在线 | 黄色视频操逼 | 成人视频日本 | 思思热在线视频免费观看 | 狠狠操成人免费黄色视频 |