Python--TKinter

      網(wǎng)友投稿 952 2025-04-01

      GUI介紹


      GraphicalUserInterface

      GUI for Python: TKinter, wxPython, PyQt

      TKinter:

      綁定的是TK GUI工具集,用Python包裝的Tcl代碼

      PyGIK

      TKinter的替代品

      wxPython

      跨平臺(tái)的Python GUI

      PyQt

      跨平臺(tái)的

      商業(yè)授權(quán)可能有問(wèn)題

      推薦資料

      辛星GUI,辛星Python(簡(jiǎn)潔、清晰)

      Python GUI Programming cookbook

      TKinter reference a GUI for Python

      # 測(cè)試tkinter包是否好用 import tkinter tkinter._test()

      # hello world import tkinter base = tkinter.Tk() # 消息循環(huán) base.mainloop()

      TKinter 常用組件

      按鈕

      Button 按鈕組件 RadioButton 單選框組件 CheckButton 選擇按鈕組件 ListButton 列表框組件

      文本輸入組件

      Entry 單行文本框組件 Text 多行文本框組件

      標(biāo)簽組件

      Label 標(biāo)簽組件,可以顯示圖片和文字 Message 標(biāo)簽組件,可以根據(jù)內(nèi)容將文字換行

      菜單

      Menu 菜單組件 MenuButton 菜單按鈕組件,可以使用Menu代替

      滾動(dòng)條

      Scale 滑塊組件 Scrollbar 滾動(dòng)條組件

      其他組件

      Canvas 畫布組件 Frame 框架組件,將多個(gè)組件編組 Toplevel 創(chuàng)建子窗口容器組件

      組件的大致使用步驟

      創(chuàng)建總面板

      創(chuàng)建面板上的各種組件

      指定組件的父組件,即附屬關(guān)系

      利用相應(yīng)的屬性對(duì)組件進(jìn)行設(shè)置

      給組件安排布局

      同步驟2相似,創(chuàng)建好多個(gè)組件

      最后,啟動(dòng)總面板的消息循環(huán)

      # Label案例 import tkinter base = tkinter.Tk() # 負(fù)責(zé)標(biāo)題 base.wm_title("Label Test") lb = tkinter.Label(base, text="Python Label") # 給相應(yīng)組件指定布局 lb.pack() base.mainloop()

      # 設(shè)置Label案例 import tkinter base = tkinter.Tk() base.wm_title("Label Test") # 支持屬性和很多background,font,underline等 # 第一個(gè)參數(shù),指定所屬 lb1 = tkinter.Label(base, text="Python AI") lb1.pack() lb2 = tkinter.Label(base, text="綠色背景", background="green") lb2.pack() lb3 = tkinter.Label(base, text="藍(lán)色背景", background="blue") lb3.pack() base.mainloop()

      # Button案例 import tkinter def showLable(): global baseFrame # 在函數(shù)中定義了一個(gè)Label # Label的父組件是baseFrame lb = tkinter.Label(baseFrame, text="顯示Label") lb.pack() baseFrame = tkinter.Tk() # 生成一個(gè)按鈕 # command參數(shù)指示,當(dāng)按鈕被按下的時(shí)候,執(zhí)行哪個(gè)函數(shù) btn = tkinter.Button(baseFrame, text="Show Lable", command=showLable) btn.pack() baseFrame.mainloop() ''' Button的屬性: anchor --------------------設(shè)置按鈕中文字的對(duì)齊方式,相對(duì)于按鈕的中心位置 background(bg)-------------設(shè)置按鈕的背景顏色 foreground(fg)-------------設(shè)置按鈕的前景色(文字的顏色) borderwidth(bd)------------設(shè)置按鈕邊框?qū)挾?cursor---------------------設(shè)置鼠標(biāo)在按鈕上的樣式 command--------------------設(shè)置按鈕點(diǎn)擊時(shí)觸發(fā)的函數(shù) bitmap---------------------設(shè)置按鈕上顯示的位圖 font-----------------------設(shè)置按鈕上文字的字體 width----------------------設(shè)置按鈕的寬度(字符個(gè)數(shù)) height---------------------設(shè)置按鈕的高度(字符個(gè)數(shù)) state----------------------設(shè)置按鈕的狀態(tài) text-----------------------設(shè)置按鈕上的文字 image----------------------設(shè)置按鈕上的圖片 '''

      '\nButton的屬性:\n\nanchor --------------------設(shè)置按鈕中文字的對(duì)齊方式,相對(duì)于按鈕的中心位置\nbackground(bg)-------------設(shè)置按鈕的背景顏色\nforeground(fg)-------------設(shè)置按鈕的前景色(文字的顏色)\nborderwidth(bd)------------設(shè)置按鈕邊框?qū)挾萛ncursor---------------------設(shè)置鼠標(biāo)在按鈕上的樣式\ncommand--------------------設(shè)置按鈕點(diǎn)擊時(shí)觸發(fā)的函數(shù)\nbitmap---------------------設(shè)置按鈕上顯示的位圖\nfont-----------------------設(shè)置按鈕上文字的字體\nwidth----------------------設(shè)置按鈕的寬度(字符個(gè)數(shù))\nheight---------------------設(shè)置按鈕的高度(字符個(gè)數(shù))\nstate----------------------設(shè)置按鈕的狀態(tài)\ntext-----------------------設(shè)置按鈕上的文字\nimage----------------------設(shè)置按鈕上的圖片\n\n'

      組件布局

      控制組件的擺放方式

      三種布局:

      pack:按照方位布局

      place:按照坐標(biāo)布局

      grid:網(wǎng)格布局

      pack布局

      最簡(jiǎn)單,代碼量最少,挨個(gè)擺放,默認(rèn)從上到下,系統(tǒng)自動(dòng)設(shè)置

      通用使用方式為:組件對(duì)象.pack(設(shè)置…)

      side: 停靠方位,可選值為L(zhǎng)EFT,TOP,RIGHT,BOTTOM

      fill:填充方式,X,Y,BOTH,NONE

      expande(是否填充):YES/NO

      anchor(停靠方向):N,E,S,W,CENTER

      ipadx:x方向的內(nèi)邊距

      ipady:y方向的內(nèi)邊距

      padx:x方向外邊界

      pady:y方向外邊界

      grid布局

      通用使用方式:組件對(duì)象.grid(設(shè)置…)

      利用row,column編號(hào),都是從0開始

      sticky:N,E,S,W表示上下左右,用來(lái)決定組件從哪個(gè)方向開始

      支持ipadx,padx等參數(shù),跟pack吉函數(shù)含義一樣

      支持rowspan,columnapan,表示跨行,跨行數(shù)量

      place布局

      明確方位的擺放

      相對(duì)位置布局,隨意改變窗口大小會(huì)導(dǎo)致混亂

      使用place函數(shù),分為絕對(duì)布局和相對(duì)布局,絕對(duì)布局是使用x,y參數(shù)

      相對(duì)布局是使用relx,rely,relheight,relwidth

      # pack布局案例 import tkinter baseFrame = tkinter.Tk() # 以下所有代碼都是創(chuàng)建一個(gè),然后布局 btn1 = tkinter.Button(baseFrame, text='A') btn1.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.Y) btn2 = tkinter.Button(baseFrame, text='B') btn2.pack(side=tkinter.TOP, expand=tkinter.YES, fill=tkinter.BOTH) btn2 = tkinter.Button(baseFrame, text='C') btn2.pack(side=tkinter.RIGHT, expand=tkinter.YES, fill=tkinter.NONE, anchor=tkinter.NE) btn2 = tkinter.Button(baseFrame, text='D') btn2.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.Y) btn2 = tkinter.Button(baseFrame, text='E') btn2.pack(side=tkinter.TOP, expand=tkinter.NO, fill=tkinter.BOTH) btn2 = tkinter.Button(baseFrame, text='F') btn2.pack(side=tkinter.BOTTOM, expand=tkinter.YES) btn2 = tkinter.Button(baseFrame, text='G') btn2.pack(anchor=tkinter.SE) baseFrame.mainloop()

      # grid布局案例 import tkinter baseFrame = tkinter.Tk() # 下面注釋掉的一行代碼跟下面兩行代碼等效 # lb1 = tkinter.Label(baseFrame, text="賬號(hào):").grid(row=0, sticky=tkinter.W) lb1 = tkinter.Label(baseFrame, text="賬號(hào):") lb1.grid(row=0, sticky=tkinter.W) en = tkinter.Entry(baseFrame) en.grid(row=0, column=1, sticky=tkinter.E) lb2 = tkinter.Label(baseFrame, text="密碼:").grid(row=1, sticky=tkinter.W) tkinter.Entry(baseFrame).grid(row=1, column=1, sticky=tkinter.E) btn = tkinter.Button(baseFrame, text="登錄").grid(row=2, column=1, sticky=tkinter.W) baseFrame.mainloop()

      消息機(jī)制

      消息的傳遞機(jī)制

      自動(dòng)發(fā)出事件/消息

      消息由系統(tǒng)負(fù)責(zé)發(fā)送到隊(duì)列

      由相關(guān)組件進(jìn)行綁定/設(shè)置

      后端自動(dòng)選擇感興趣的事件并做出相應(yīng)的反應(yīng)

      消息格式:

      <[modifier-]—type-[-detail]>

      : Button表示一個(gè)按鈕事件,1代表的是鼠標(biāo)左鍵,2代表中鍵

      :鍵盤A鍵位

      : 同時(shí)按下Control、Shift、A三個(gè)鍵位

      :F1鍵盤

      鍵位對(duì)應(yīng)名稱

      # 事件的簡(jiǎn)單例子 import tkinter def baseLabel(event): global baseFrame print("被點(diǎn)擊") lb = tkinter.Label(baseFrame, text="謝謝點(diǎn)擊") lb.pack() # 畫出程序的總框架 baseFrame = tkinter.Tk() lb = tkinter.Label(baseFrame, text="模擬按鈕") # Label綁定相應(yīng)的消息和處理函數(shù) # 自動(dòng)獲取左鍵點(diǎn)擊,并啟動(dòng)相應(yīng)的處理函數(shù)baseLabel lb.bind("", baseLabel) lb.pack() # 啟動(dòng)消息循環(huán) # 至此,表示程序開始執(zhí)行 baseFrame.mainloop()

      被點(diǎn)擊

      TKinter的綁定

      bind_all:全局范圍的綁定,默認(rèn)的是全局快捷鍵,比如F1是幫助文檔

      bind_class:接受三個(gè)參數(shù),第一個(gè)是類名,第二個(gè)是事件,第三個(gè)是操作

      w._bind_class(“Entry”, “”, my_paste)

      bind:?jiǎn)为?dú)對(duì)某一個(gè)實(shí)例綁定

      unbind:解綁,需要一個(gè)參數(shù),即你要解綁哪個(gè)事件

      Entry

      輸入框,功能單一

      entry[“show”] = “*”,設(shè)置遮擋字符

      # 輸入框案例 import tkinter # 模擬登錄函數(shù) def reg(): # 從相應(yīng)輸入框中,得到用戶的輸入 name = e1.get() pwd = e2.get() t1 = len(name) t2 = len(pwd) if name == "111" and pwd == "222": # 需要理解下面代碼的含義 lb3["text"] = "登錄成功" else: lb3["text"] = "用戶名或密碼錯(cuò)誤" # 輸入框刪除用戶輸入的內(nèi)容 # 注意delete的兩個(gè)參數(shù),表示從第幾個(gè)刪除到第幾個(gè) e1.delete(0,t1) e2.delete(0,t2) # 啟動(dòng)舞臺(tái) baseFrame = tkinter.Tk() lb1 = tkinter.Label(baseFrame, text="用戶名:") lb1.grid(row=0, column=0, stick=tkinter.W) e1 = tkinter.Entry(baseFrame) e1.grid(row=0, column=1, stick=tkinter.E) lb2 = tkinter.Label(baseFrame, text="密碼:") lb2.grid(row=1, column=0, stick=tkinter.W) e2 = tkinter.Entry(baseFrame) e2.grid(row=1, column=1, stick=tkinter.E) e2['show'] = '*' # Button參數(shù)command的意思是,當(dāng)按鈕被點(diǎn)擊后啟動(dòng)相應(yīng)的處理函數(shù) btn = tkinter.Button(baseFrame, text="登錄", command=reg) btn.grid(row=2, column=1, stick=tkinter.E) lb3 = tkinter.Label(baseFrame, text="") lb3.grid(row=3) # 啟動(dòng)主Frame baseFrame.mainloop()

      菜單

      Python--TKinter

      第一個(gè)Menu類定義的是parent

      add_command 添加菜單項(xiàng),如果菜單是頂層菜單,則從左向右添加,

      否則就是下拉菜單

      label:指定菜單項(xiàng)名稱

      command:點(diǎn)擊后相應(yīng)的調(diào)用函數(shù)

      acceletor:快捷鍵

      underline:指定是否菜單信息下有橫線

      menu:屬性指定哪一個(gè)作為頂級(jí)菜單

      # 普通菜單案例 import tkinter baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) for item in ['File', 'Edit', 'View', 'Aboyt']: menubar.add_command(label=item) baseFrame['menu'] = menubar baseFrame.mainloop()

      add_cascade:級(jí)聯(lián)菜單,作用是引出后面的菜單

      add_cascade的menu屬性:指定把菜單級(jí)聯(lián)到哪個(gè)菜單上

      label:名稱

      過(guò)程:

      建立menu實(shí)例

      add_command

      add_cascade

      # 級(jí)聯(lián)菜單案例 import tkinter baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) emenu = tkinter.Menu(menubar) for item in ['Copy', 'Past', 'Cut']: emenu.add_command(label=item) menubar.add_cascade(label='File') menubar.add_cascade(label='Edit', menu=emenu) menubar.add_cascade(label='About') baseFrame['menu'] = menubar baseFrame.mainloop()

      彈出菜單也叫上下文菜單

      實(shí)現(xiàn)的大致思路

      建立菜單并向菜單添加各種功能

      監(jiān)聽鼠標(biāo)右鍵

      如果右鍵點(diǎn)擊,則根據(jù)位置判斷彈出

      調(diào)用Menu的pop方法

      add_separator:添加分隔符

      # 彈出式菜單案例 import tkinter def makeLabel(): global baseFrame tkinter.Label(baseFrame, text="PHP是最好的編程語(yǔ)言,我用Python").pack() baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) for x in ['麻辣香菇', '汽鍋雞', '東坡肘子']: menubar.add_separator() menubar.add_command(label=x) menubar.add_command(label="重慶火鍋", command=makeLabel) # 事件處理函數(shù)一定要至少有一個(gè)參數(shù),且第一個(gè)參數(shù)表示的是系統(tǒng)事件 def pop(event): # 注意使用 event.x 和 event.x_root 的區(qū)別 # menubar.post(event.x, event.y) menubar.post(event.x_root, event.y_root) baseFrame.bind("", pop) baseFrame.mainloop()

      canvas 畫布

      畫布:可以自由的在上面繪制圖形的一個(gè)小舞臺(tái)

      在畫布上繪制對(duì)象,通常用create_xxxx,xxxx=對(duì)象類型,例如line,rectangle

      畫布的作用的把一定的組件畫到畫布上顯示出來(lái)

      畫布所支持的組件:

      arc(圓或者弧)

      bitmap(一個(gè)位圖)

      image(BitmapImage,PhotoImage)(圖片)

      line(線)

      oval(橢圓形)

      polygon(多邊形)

      rectangle(四邊形)

      text(文字)

      window(組件)

      每次調(diào)用create_xxx都會(huì)返回一個(gè)創(chuàng)建的組件的ID,同時(shí)也可以用tag屬性指定其標(biāo)簽

      通過(guò)調(diào)用canvas.move實(shí)現(xiàn)一個(gè)一次性動(dòng)作

      # canvas案例 import tkinter baseFrame = tkinter.Tk() cvs = tkinter.Canvas(baseFrame, width=300, height=200) cvs.pack() # 一條線需要兩個(gè)點(diǎn)指明起始 # 參數(shù)數(shù)字的單位是px cvs.create_line(23,23, 190,234) cvs.create_text(56,67, text="I LOVE PYTHON") baseFrame.mainloop()

      # 畫一個(gè)五角星 import tkinter import math as m baseFrame = tkinter.Tk() w = tkinter.Canvas(baseFrame, width=300, height=300, background="gray") w.pack() # 中心點(diǎn) center_x = 150 center_y = 150 r = 150 # 依次存放五個(gè)點(diǎn)的位置 points = [ # 左上點(diǎn) # pi是一個(gè)常量數(shù)字,3.1415926 center_x - int(r * m.sin(2 * m.pi / 5)), center_y - int(r * m.cos(2 * m.pi / 5)), # 右上點(diǎn) center_x + int(r * m.sin(2 * m.pi / 5)), center_y - int(r * m.cos(2 * m.pi / 5)), # 左下點(diǎn) center_x - int(r * m.sin( m.pi / 5)), center_y + int(r * m.cos( m.pi / 5)), # 頂點(diǎn) center_x, center_y - r, # 右下點(diǎn) center_x + int(r * m.sin( m.pi / 5)), center_x + int(r * m.cos( m.pi / 5)), ] # 創(chuàng)建一個(gè)多邊形 w.create_polygon(points, outline="green", fill="yellow") w.create_text(150,150, text="五角星") baseFrame.mainloop()

      import tkinter baseFrame = tkinter.Tk() def btnClick(event): global w w.move(id_ball, 12,5) w.move("fall", 0,5) def btnClick_1(event): global w w.move(id_ball, -12,-5) w.move("fall", 0,-5) w = tkinter.Canvas(baseFrame, width=500, height=400) w.pack() w.bind('', btnClick) w.bind('', btnClick_1) # 創(chuàng)建組件后返回id id_ball = w.create_oval(20,20, 50,50, fill="green") # 創(chuàng)建組件中使用tag屬性 w.create_text(123,56, fill="red", text="ILovePython", tag="fall") # 創(chuàng)建的時(shí)候如果沒(méi)有指定tag可以利用addtag_withtag添加 # 同類函數(shù)還有 addtag_all, addtag_above, addtag_xxx等等 id_rectangle = w.create_rectangle(56,78, 173,110, fill="gray") w.addtag_withtag("fall", id_rectangle) baseFrame.mainloop()

      GUI Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel使用DSUM函數(shù)計(jì)算指定條件的數(shù)字之和
      下一篇:Oracle 11GR2單機(jī)一鍵部署(sh腳本)
      相關(guān)文章
      亚洲欧美aⅴ在线资源| 亚洲综合激情五月丁香六月| 亚洲综合色一区二区三区| 亚洲最大视频网站| 亚洲福利在线视频| 亚洲国产香蕉碰碰人人| 亚洲AV无码欧洲AV无码网站| 亚洲最大激情中文字幕| 国产自偷亚洲精品页65页| 久久亚洲高清综合| 亚洲欧洲日产国码无码久久99| 国产性爱在线观看亚洲黄色一级片 | 亚洲成av人在线视| 亚洲av无码不卡| 亚洲日本精品一区二区| 亚洲自偷自偷精品| 久久综合亚洲鲁鲁五月天| 亚洲理论在线观看| 亚洲中文久久精品无码1| 亚洲欧洲日韩极速播放| 亚洲精品无AMM毛片| 亚洲AV综合永久无码精品天堂| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲成AV人在线观看网址| 亚洲成网777777国产精品| 亚洲精品国产自在久久| 三上悠亚亚洲一区高清| 亚洲av无码专区在线播放| 亚洲性天天干天天摸| 亚洲免费电影网站| 亚洲国产成人AV在线播放| 国产产在线精品亚洲AAVV| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 国产精品亚洲综合专区片高清久久久 | 亚洲综合一区无码精品| 亚洲AV无码专区亚洲AV桃| 亚洲AV伊人久久青青草原| 亚洲午夜久久久影院| 亚洲午夜精品久久久久久人妖| 亚洲欧洲精品久久| 亚洲乱妇老熟女爽到高潮的片|