為python插上翅膀,可視化接口工具tkinter的詳解

基本概念

GUI

- Graphical User Interface. 中文叫圖形用戶接口。圖像用戶接口可以看做為人與計算機之間的溝通媒介。

如果想為自己寫的程序做一個易於操作的界面,那麼,tkinter應該是最容易上手的圖形接口開發工具。

tkinter 是python自帶的模塊,在安裝python的同時,tkinter模塊就已經在系統裡了。只需import導入,即可使用。tkinter模塊並沒有網上說的那麼差,只是官方編寫的tkinter的文檔很差勁。之後的一段時間,我會將tkinter模塊的使用做一個詳細的介紹。

導入tkinter模塊

from tkinter import * 或者是 import tkinter as tk

這是兩種最常見的導入寫法。

from X import * 和 import X 的區別

在導入python 模塊的時候,很多時候我們都面臨上述兩種導入的選擇。下面我將說明這兩種方法的區別。

import X

import X 意味著創建了一個模塊 X的引用。假設模塊X裡有一個函數方法 func(),如果想調用func,就需要使用完整的路徑,例如 X.func();

from X import *

from X import * 意味著對模塊X裡的所有對象創建了引用。此時,如果想調用func,只需要使用func()即可。同時,由於你並沒有創建X的引用,你將無法通過X.func()調用func方法。

舉個例子,模塊X相當於姓氏,模塊X裡的對象相當於名。如果一個班兩個 ’天天‘,一個叫陶天天,一個叫歐天天。那麼,老師就需要加上姓去區分兩個’天天‘。但是,如果班裡只有一個孩子叫’天天‘,就只需要喊’天天‘就好。

導入tkinter模塊之後,可以使用TkVersion去查看tkinter模塊的版本。

<code>import tkinter as tk
print(tk.TkVersion)
Out[2]: 8.6/<code>

創建窗口

tkinter中的Tk() 方法可以創建一個根窗口,之後添加的控件將會被放進這個創建的窗口裡。

<code>import tkinter as tk
window = tk.Tk()
window.mainloop()/<code>
逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

創建的窗口,取名window

window.mainloop() 會啟動創建的window GUI。

窗口建立好,就需要進行一些相關的設置。比如窗口標題,圖標,大小,底色等等。

添加圖標

默認的圖標是一片樹葉,如上圖左上角。自己建的窗口,自然想換上漂亮、大氣的圖標。tkinter提供了iconbitmap 方法來更換圖標。如果想使用下圖作為圖標,我們只需要如下設置。


逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

圖標

<code>import tkinter as tk
window = tk.Tk()
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>

'palm-tree-icon.ico' 是圖標存儲的路徑,如果圖標在程序所在的文件夾裡,可以直接調用。不然就得使用完整的路徑。

逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

圖標更改後的窗口

設置標題

默認的窗口標題是左上角的tk,通過title()可以設置窗口的標題。

<code>import tkinter as tk
window = tk.Tk()
window.title('逃學聯盟')
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>
逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

標題更改後的窗口

設置背景顏色

使用configure()設置背景顏色,window.configure(bg='#008CBA')

<code>import tkinter as tk
window = tk.Tk()
window.title('逃學聯盟')

window.configure(bg='#008CBA')
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>
逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

背景色設置後的窗口

設置窗口大小和屏幕的相對位置

geometry()可以用來設置初始窗口的大小以及窗口於屏幕的相對位置。注意,代碼中的x不是乘法,是字母xy的x。具體方法如下:

.geometry("窗口寬 x 窗口高 + 屏幕左邊框相對距離 + 屏幕上邊框相對距離")。

<code>import tkinter as tk
window = tk.Tk()
window.title('逃學聯盟')
window.configure(bg='#008CBA')
window.geometry("500x100+300+300")
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>

上述代碼創建了一個500 * 100 px大小的窗口,窗口左上角座標是(300,300)。

逃學博士出品 - 為python插上翅膀,可視化接口工具tkinter的詳解

如果需要將窗口放在屏幕的正中,可以通過一些簡單的計算和geometry()方法。

通過.winfo_screenwidth() 和 .winfo_screenheight() 方法可以得到屏幕的寬和高。如果我們需要將窗口放在屏幕正中,窗口的左邊框距離屏幕的左邊框為 (屏幕寬 - 窗口寬)/ 2

<code>import tkinter as tk
window = tk.Tk()
window.title('逃學聯盟')
window.configure(bg='#008CBA')

window_width = 500
window_height = 100
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()

x = int((screen_width - window_width)/2)
y = int((screen_height - window_height)/2)

window.geometry(f"{window_width}x{window_height}+{x}+{y}")
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>

設置窗口的最小的寬高,最大的寬高,全屏顯示和窗口是否可以拖拽大小

.resizable(True, True)方法設置窗口的寬和長是否可以拖拽調整大小;

.minsize(寬, 高)方法設置窗口的最小寬高

.maxsize(寬, 高)方法設置窗口的最大寬高

.state('zoomed')方法設置窗口全屏顯示

.maxsize(寬, 高)方法 和 .state('zoomed')方法不要同時使用。

<code>import tkinter as tk
window = tk.Tk()
window.title('逃學聯盟')
window.configure(bg='#008CBA')

window.resizable(True, True)
window.minsize(100, 100)
# window.maxsize(1000, 500)
window.state('zoomed')

window_width = 500
window_height = 100
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()

x = int((screen_width - window_width)/2)
y = int((screen_height - window_height)/2)

window.geometry(f"{window_width}x{window_height}+{x}+{y}")
window.iconbitmap('palm-tree-icon.ico')
window.mainloop()/<code>

實例1

鑑於還沒有開始其他的tkinter組件,第一個實例藉助after方法實現窗口背景色的更換還有窗口的關閉。

after(delay_ms, callback=None, *args)

after()方法會每隔delay_ms (毫秒)調用callback的函數。

window.destroy()方法會關閉window窗口。

<code>import tkinter as tk
import random

window = tk.Tk()
window.title('逃學聯盟')

window.configure(bg='#008CBA')

window.resizable(True, True)
window.minsize(100, 100)
# window.maxsize(1000, 500)
window.state('zoomed')

window_width = 500
window_height = 100
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()

x = int((screen_width - window_width)/2)
y = int((screen_height - window_height)/2)

window.geometry(f"{window_width}x{window_height}+{x}+{y}")
window.iconbitmap('palm-tree-icon.ico')

bg_color_list = ['#008CBA', '#FFA500', '#4CAF50', '#f44336']

def adjust_bg_color():
if bg_color_list:
rand = random.choice(bg_color_list)
window.configure(bg=rand)
window.after(2000, adjust_bg_color)
bg_color_list.remove(rand)
else:
window.destroy()

window.after(0, adjust_bg_color)
window.mainloop()/<code>
  • 定義一個列表 bg_color_list 含有四種不同的顏色代號;
  • 定義callback函數 adjust_bg_color, 如果adjust_bg_color裡有值,則隨機挑選一個顏色,並更改窗口的bg屬性;
  • 每隔2000毫秒調用一次adjust_bg_color;
  • 列表 bg_color_list 中移除被選中的顏色代號;
  • 如果列表 bg_color_list 為空,則關閉窗口;


感興趣的同學可以自行運行例子,後面會逐一介紹tkinter的組件。謝謝大家!


分享到:


相關文章: