<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
圖形化使用者介面 (GUI) 只不過是一個桌面應用程式,可幫助我們與計算機進行互動
這些都是我們日常在電腦上使用的一些不同型別的 GUI 應用程式,其實我們通過 Tkinter 也是可以構建簡單的類似應用程式的
今天我們作為 GUI 的入門,將建立一個非常簡單且漂亮的 GUI 應用程式
Python 有大量的第三方類庫,對於 GUI 庫,主要有以下幾種:
其中,Tkinter 是很多學習者和開發者的首選,因為它簡單易用而且隨 Python 安裝自帶
下面的圖片顯示了應用程式是如何在 Tkinter 中實際執行
我們首先匯入 Tkinter 模型,接著,我們建立主視窗,在這個視窗中,我們將要執行操作並顯示一切視覺效果,接下來我們新增 Widgets,最後我們進入 Main Event Loop
這裡有 2 個重要的關鍵字
事件迴圈基本上是告訴程式碼繼續顯示視窗,直到我們手動關閉它,是在後臺無限迴圈執行的
對於 Widgets 我們後面單獨學習
下面一個程式碼例子,來深入理解下
import tkinter window = tkinter.Tk() # to rename the title of the window window.title("GUI") # pack is used to show the object in the window label = tkinter.Label(window, text = "Hello World!").pack() window.mainloop()
我們匯入 Tkinter 包並定義一個視窗,接著我們可以修改一個視窗標題,每當開啟應用程式時,該標題都會顯示在標題索引標籤上
最後,我們還定義了一個標籤,標籤只不過是需要在視窗上顯示的輸出,在例子中是 hello world
那麼到底什麼是 Widgets 呢
Widgets 類似於 HTML 中的元素,我們可以在 Tkinter 中找到針對不同型別元素的不同型別的 Widgets
讓我們看看 Tkinter 中所有這些 Widgets 的簡要介紹
下面讓我們逐一看一下每個 Widgets 的用法
標籤用於建立文字和影象以及所有相關的,而且要注意的是,它只能是單行定義
l1 = Label(window, text="蘿蔔大雜燴!", font=("ArialBold", 50)) l1.grid(column=0, row=0)
還有一個函數 geometry,它基本上用於更改視窗大小並根據我們的要求進行設定
l1 = Label(window, text="蘿蔔大雜燴!", font=("ArialBold", 50)) window.geometry('350x200')
在這種情況下,我們將其設定為寬 350 畫素和高 200 畫素
接下來是 button
按鈕與標籤非常相似,我們建立一個變數並使用 Widgets 語法來定義按鈕要表達的內容
window.geometry('350x200') bt = Button(window, text="Enter")
我們還可以更改按鈕或任何其他 Widgets 的前景顏色,使用程式碼中所示的引數 FG。 同樣,也可以使用 BG 屬性更改背景顏色
bt = Button(window, text="Enter", bg="orange", fg="red") bt.grid(column=1, row=0)
我們的前景是定義為紅色的文字,背景為橙色
下面來看一下點選按鈕的操作
def clicked(): l1.configure(text="按鈕被點選了!!") bt = Button(window, text="Enter", bg="orange", fg="red", command=clicked)
這個我們稱之為點選事件,我們需要編寫有關單擊按鈕或觸發單擊事件時應該發生什麼的功能
我們定義了一個名為 clicked 的函數,可以顯示一條文字訊息,我們在按鈕定義中新增一個名為 command 的引數,來呼叫點選事件
它用於在 GUI 中建立輸入欄位以接收文字輸入
txt = Entry(window, width=10) txt.grid(column=1, row=0) def clicked(): res = "Welcome to " + txt.get() l1.configure(text=res) bt = Button(window, text="Enter", bg="orange", fg="red", command=clicked)
在這裡,我們使用 Tkinter Entry 類建立一個文字方塊,grid 定義我們希望視窗小部件位於何處
同時 clicked 函數接收 Entry 的文字資訊
這是一個帶有某些選項的下拉式選單
from tkinter.ttk import * combo = Combobox(window) combo['values']= (1, 2, 3, 4, 5, "Text") combo.current(3) combo.grid(column=0, row=0)
這樣一個下拉式選單就完成了
核取按鈕是非常常用的元件
chk_state = BooleanVar() chk_state.set (True) chk = Checkbutton(window, text="Select", var=chk_state) chk.grid(column=4, row=0)
我們首先建立一個 booleanvar 型別的變數,這是一個 Tkinter 變數
預設情況下,我們將設定狀態保持為 true,這代表按鈕已經被選中 接下來,我們將 chk_state 傳遞給 checkbutton 類來為我們設定檢查狀態
無線電鈕也是非常常用的
rad1 = Radiobutton(window, text=Python', value=1) rad2 = Radiobutton(window, text=Java', value=2) rad3 = Radiobutton(window, text=Scala', value=3) rad1.grid(column=0, row=0) rad2.grid(column=1, row=0) rad3.grid(column=2, row=0)
在這裡,我們使用了不同的引數值,1,2和3,如果它們相同,則會導致衝突並出現錯誤
它們的文字資料是可以相同,在這裡,我們使用了 Python、Java 和 Scala
捲動文字元件
scro_txt = scrolledtext.ScrolledText(window, width=40,height=10) scro_txt.grid(column=0, row=4)
我們指定了視窗的高和寬,否則預設會填充整個 Windiws 視窗
訊息元件可以方便的彈出提醒訊息
def clicked(): messagebox.showinfo('Message title', 'Message content') btn = Button(window,text=‘ENTER', command=clicked)
Spinbox 也是一個常見的元件,有兩個索引標籤,存在向上和向下捲動索引標籤
pin = Spinbox(window, from_=0, to=100, width=5)
有 3 個引數——from、to 和 width
Tkinter 中的所有 Widgets 都會有一些位置資訊,這些度量使得我們可以組織 Widgets 及其父框架、視窗等
Tkinter 具有以下三個佈局方式
為了在視窗中安排佈局,我們將使用 Frame 類
在下面的程式碼中,我們使用 window、top_frame、bottom_frame 來佈局
import tkinter window = tkinter.Tk() window.title("GUI") # creating 2 frames TOP and BOTTOM top_frame = tkinter.Frame(window).pack() bottom_frame = tkinter.Frame(window).pack(side = "bottom") # now, create some widgets in the top_frame and bottom_frame btn1 = tkinter.Button(top_frame, text = "Button1", fg = "red").pack()# 'fg - foreground' is used to color the contents btn2 = tkinter.Button(top_frame, text = "Button2", fg = "green").pack()# 'text' is used to write the text on the Button btn3 = tkinter.Button(bottom_frame, text = "Button2", fg = "purple").pack(side = "left")# 'side' is used to align the widgets btn4 = tkinter.Button(bottom_frame, text = "Button2", fg = "orange").pack(side = "left") window.mainloop()
再來看一個登入的小栗子
import tkinter window = tkinter.Tk() window.title("GUI") # creating 2 text labels and input labels tkinter.Label(window, text = "Username").grid(row = 0) # this is placed in 0 0 # 'Entry' is used to display the input-field tkinter.Entry(window).grid(row = 0, column = 1) # this is placed in 0 1 tkinter.Label(window, text = "Password").grid(row = 1) # this is placed in 1 0 tkinter.Entry(window).grid(row = 1, column = 1) # this is placed in 1 1 # 'Checkbutton' is used to create the check buttons tkinter.Checkbutton(window, text = "Keep Me Logged In").grid(columnspan = 2) # 'columnspan' tells to take the width of 2 columns # you can also use 'rowspan' in the similar manner window.mainloop()
下面我們來了解 binding 函數
每當事件發生時呼叫函數就是繫結函數
在下面的範例中,當單擊按鈕時,它會呼叫一個名為 say_hi 的函數。 函數 say_hi 會建立一個帶有文字 Hi 的新標籤
import tkinter window = tkinter.Tk() window.title("GUI") # creating a function called say_hi() def say_hi(): tkinter.Label(window, text = "Hi").pack() tkinter.Button(window, text = "Click Me!", command = say_hi).pack() # 'command' is executed when you click the button # in this above case we're calling the function 'say_hi'. window.mainloop()
另一種繫結函數的方法是使用事件,事件類似於滑鼠移動、滑鼠懸停、單擊和捲動等等
import tkinter window = tkinter.Tk() window.title("GUI") # creating a function with an arguments 'event' def say_hi(event): # you can rename 'event' to anything you want tkinter.Label(window, text = "Hi").pack() btn = tkinter.Button(window, text = "Click Me!") btn.bind("Button-1", say_hi) # 'bind' takes 2 parameters 1st is 'event' 2nd is 'function' btn.pack() window.mainloop()
單擊事件有 3 種不同的型別,分別是 leftClick、middleClick 和 rightClick
下面的程式碼將使用對於的文字建立一個新標籤
import tkinter window = tkinter.Tk() window.title("GUI") #creating 3 different functions for 3 events def left_click(event): tkinter.Label(window, text = "Left Click!").pack() def middle_click(event): tkinter.Label(window, text = "Middle Click!").pack() def right_click(event): tkinter.Label(window, text = "Right Click!").pack() window.bind("Button-1", left_click) window.bind("Button-2", middle_click) window.bind("Button-3", right_click) window.mainloop()
我們可以使用 PhotoImage 方法新增影象和圖示
import tkinter window = tkinter.Tk() window.title("GUI") # taking image from the directory and storing the source in a variable icon = tkinter.PhotoImage(file = "4.PNG") # displaying the picture using a 'Label' by passing the 'picture' variriable to 'image' parameter label = tkinter.Label(window, image = icon) label.pack() window.mainloop()
好了,進步的 Tkinter 知識我們都梳理完畢了,下面就完成一個簡單的實戰專案吧
首先初始化頁面
window = Tk() window.geometry("350x380") window.resizable(0, 0) # this prevents from resizing the window window.title("小小計算器")
接下來定義輸入數位框
input_text = StringVar() input_frame = Frame(window, width=312, height=50, bd=0, highlightbackground="black", highlightcolor="black", highlightthickness=1) input_frame.pack(side=TOP) input_field = Entry(input_frame, font=('arial', 18, 'bold'), textvariable=input_text, width=50, bg="#eee", bd=0, justify=RIGHT) input_field.grid(row=0, column=0) input_field.pack(ipady=10)
然後定義按鈕方法,我們以清除按鈕和除法按鈕為例
clear = Button(btns_frame, text="C", fg="black", width=32, height=3, bd=0, bg="#eee", cursor="hand2", command=lambda: btn_clear()).grid(row=0, column=0, columnspan=3, padx=1, pady=1) divide = Button(btns_frame, text="/", fg="black", width=10, height=3, bd=0, bg="#eee", cursor="hand2", command=lambda: btn_click("/")).grid(row=0, column=3, padx=1, pady=1)
最後就是計算equal邏輯
equals = Button(btns_frame, text="=", fg="black", width=10, height=3, bd=0, bg="#eee", cursor="hand2", command=lambda: btn_equal()).grid(row=4, column=3, padx=1, pady=1) def btn_equal(): global expression result = str(eval(expression)) input_text.set(result) expression = ""
好了,讓我看下最終的效果吧,雖然頁面很簡陋,但是加減乘除這些基本運算還是包含了的
以上就是Python GUI佈局工具Tkinter入門之旅的詳細內容,更多關於Python GUI佈局Tkinter的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45