在容器中嵌入一個容器
代碼在最下面
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext # 導入滾動文本框的模塊
win = tk.Tk()
win.title("Python GUI") # 添加標題
# 創建一個容器,
monty = ttk.LabelFrame(win, text=" Monty Python ") # 創建一個容器,其父容器為win
monty.grid(column=0, row=0, padx=10, pady=10) # padx pady 該容器外圍需要留出的空余空間
aLabel = ttk.Label(monty, text="A Label")
ttk.Label(monty, text="Chooes a number").grid(column=1, row=0) # 添加一個標簽,并將其列設置為1,行設置為0
ttk.Label(monty, text="Enter a name:").grid(column=0, row=0, sticky='W') # 設置其在界面中出現的位置 column代表列 row 代表行
# button被點擊之后會被執行
def clickMe(): # 當acction被點擊時,該函數則生效
action.configure(text='Hello ' + name.get() + ' ' + numberChosen.get()) # 設置button顯示的內容
print('check3 is %s %s' % (type(chvarEn.get()), chvarEn.get()))
# 按鈕
action = ttk.Button(monty, text="Click Me!", command=clickMe) # 創建一個按鈕, text:顯示按鈕上面顯示的文字, command:當這個按鈕被點擊之后會調用command函數
action.grid(column=2, row=1) # 設置其在界面中出現的位置 column代表列 row 代表行
# 文本框
name = tk.StringVar() # StringVar是Tk庫內部定義的字符串變量類型,在這里用于管理部件上面的字符;不過一般用在按鈕button上。改變StringVar,按鈕上的文字也隨之改變。
nameEntered = ttk.Entry(monty, width=12, textvariable=name) # 創建一個文本框,定義長度為12個字符長度,并且將文本框中的內容綁定到上一句定義的name變量上,方便clickMe調用
nameEntered.grid(column=0, row=1, sticky=tk.W) # 設置其在界面中出現的位置 column代表列 row 代表行
nameEntered.focus() # 當程序運行時,光標默認會出現在該文本框中
# 創建一個下拉列表
number = tk.StringVar()
numberChosen = ttk.Combobox(monty, width=12, textvariable=number, state='readonly')
numberChosen['values'] = (1, 2, 4, 42, 100) # 設置下拉列表的值
numberChosen.grid(column=1, row=1) # 設置其在界面中出現的位置 column代表列 row 代表行
numberChosen.current(0) # 設置下拉列表默認顯示的值,0為 numberChosen['values'] 的下標值
# 復選框
chVarDis = tk.IntVar() # 用來獲取復選框是否被勾選,通過chVarDis.get()來獲取其的狀態,其狀態值為int類型 勾選為1 未勾選為0
check1 = tk.Checkbutton(monty, text="Disabled", variable=chVarDis, state='disabled') # text為該復選框后面顯示的名稱, variable將該復選框的狀態賦值給一個變量,當state='disabled'時,該復選框為灰色,不能點的狀態
check1.select() # 該復選框是否勾選,select為勾選, deselect為不勾選
check1.grid(column=0, row=4, sticky=tk.W) # sticky=tk.W 當該列中其他行或該行中的其他列的某一個功能拉長這列的寬度或高度時,設定該值可以保證本行保持左對齊,N:北/上對齊 S:南/下對齊 W:西/左對齊 E:東/右對齊
chvarUn = tk.IntVar()
check2 = tk.Checkbutton(monty, text="UnChecked", variable=chvarUn)
check2.deselect()
check2.grid(column=1, row=4, sticky=tk.W)
chvarEn = tk.IntVar()
check3 = tk.Checkbutton(monty, text="Enabled", variable=chvarEn)
check3.select()
check3.grid(column=2, row=4, sticky=tk.W)
# 單選按鈕
# 定義幾個顏色的全局變量
colors = ["Blue", "Gold", "Red"]
# 單選按鈕回調函數,就是當單選按鈕被點擊會執行該函數
def radCall():
radSel = radVar.get()
if radSel == 0:
win.configure(background=colors[0]) # 設置整個界面的背景顏色
print(radVar.get())
elif radSel == 1:
win.configure(background=colors[1])
elif radSel == 2:
win.configure(background=colors[2])
radVar = tk.IntVar() # 通過tk.IntVar() 獲取單選按鈕value參數對應的值
radVar.set(99)
for col in range(3):
# curRad = 'rad' + str(col)
curRad = tk.Radiobutton(monty, text=colors[col], variable=radVar, value=col, command=radCall) # 當該單選按鈕被點擊時,會觸發參數command對應的函數
curRad.grid(column=col, row=5, sticky=tk.W) # 參數sticky對應的值參考復選框的解釋
# 滾動文本框
scrolW = 30 # 設置文本框的長度
scrolH = 3 # 設置文本框的高度
scr = scrolledtext.ScrolledText(monty, width=scrolW, height=scrolH, wrap=tk.WORD) # wrap=tk.WORD 這個值表示在行的末尾如果有一個單詞跨行,會將該單詞放到下一行顯示,比如輸入hello,he在第一行的行尾,llo在第二行的行首, 這時如果wrap=tk.WORD,則表示會將 hello 這個單詞挪到下一行行首顯示, wrap默認的值為tk.CHAR
scr.grid(column=0, columnspan=3) # columnspan 個人理解是將3列合并成一列 也可以通過 sticky=tk.W 來控制該文本框的對齊方式
# 標簽容器
# 創建一個容器,其父容器為monty
labelsFrame = ttk.LabelFrame(monty, text='Labels in a Frame')
labelsFrame.grid(column=1, row=7)
# 將標簽放入到容器中
ttk.Label(labelsFrame, text='Label1').grid(column=0, row=0)
ttk.Label(labelsFrame, text='Label2').grid(column=1, row=0)
ttk.Label(labelsFrame, text='Label3').grid(column=2, row=0)
for child in labelsFrame.winfo_children(): # labelsFrame.winfo_children 可以獲取labelsFrame容器的所有子部件的對象
child.grid_configure(padx=8, pady=4) # 通過子部件對象的grid_configure()方法可以修改部件的屬性
win.mainloop() # 當調用mainloop()時,窗口才會顯示出來
代碼執行結果如圖
fabca80c-8ee8-47c9-84d9-2d7c81e732a2.jpg