我現在正在練習如何在tkinter中動態設定幀。
對于純粹的框架設定,它看起來很完美:
import tkinter as tk
class MyWindow。
def __init__(self, root):
w_root = 1280.
h_root = 720: w_root = 1280.
root.title('My model')
root.geometry(f"{w_root}x{h_root}")
self.top_frame = tk.Frame(root, width=w_root, height=80, bg='灰色)
self.top_frame.grid(row=0, column=0, padx=0, pady=5)
self.main_frame = tk.Frame(root, width=w_root, height=640, bg='blue' /span>)
self.main_frame.grid(row=1, column=0, padx=0, pady=0)
self.left_frame = tk.Frame(self.main_frame, width=500, height=620, bg='red)
self.left_frame.grid(row=0, column=0, padx=5, pady=5)
self.right_frame = tk.Frame(self.main_frame, width=760, height=620, bg='yellow' /span>)
self.right_frame.grid(row=0, column=1, padx=5,pady=5)
root = tk.Tk()
mywin = MyWindow(root)
root.mainloop()
然而,當我試圖在left_frame(主框架內的框架)中放置一個標簽時,界面變得很奇怪:
import tkinter as tk
class MyWindow。
def __init__(self, root):
w_root = 1280.
h_root = 720: w_root = 1280.
root.title('My model')
root.geometry(f"{w_root}x{h_root}")
self.top_frame = tk.Frame(root, width=w_root, height=80, bg='灰色)
self.top_frame.grid(row=0, column=0, padx=0, pady=5)
self.main_frame = tk.Frame(root, width=w_root, height=640, bg='blue' /span>)
self.main_frame.grid(row=1, column=0, padx=0, pady=0)
self.left_frame = tk.Frame(self.main_frame, width=500, height=620, bg='red)
self.left_frame.grid(row=0, column=0, padx=5, pady=5)
self.right_frame = tk.Frame(self.main_frame, width=760, height=620, bg='yellow' /span>)
self.right_frame.grid(row=0, column=1, padx=5, pady=5)
self.lb_currdate = tk.Label(self.left_frame, text='my lable1:'/span>)
self.lb_currdate.config(font=('Arial', 9)
self.lb_currdate.grid(row=0, column=0, padx=5, pady=5)
self.ent_currdate = tk.Entry(self.left_frame)
self.ent_currdate.insert(tk.END, str(0)
self.ent_currdate.grid(row=0, column=1, padx=5, pady=5)
root = tk.Tk()
mywin = MyWindow(root)
root.mainloop()
我希望框架看起來是一樣的,并且標簽和條目將在紅色框架(左側框架)的頂部發生位移。
我對此很困惑,誰能給我一個提示,哪一行的代碼是錯誤的?
謝謝你
#-----Update------
根據建議,我在我的網格中加入了sticky。 它看起來好多了,但仍然沒有100%達到我的預期。我嘗試了不同的粘性組合,但沒有一個是正確的:
測驗1(測驗中)。
Test1 (給予左框粘性): 主機沒有填寫enti 測驗2 (Test2)
測驗2(給左框和主框都貼上): 左框和右框沒有填滿主框 問題是,框架會自動調整大小以適應內容。為了解決這個問題,你可以使用 你將需要對每一個你想表現得像這樣的幀進行這樣的處理。
你也可以使用不同的粘性值來產生不同的結果,例如,如果你只使用 為了使框架填滿空間,你可以使用 簡而言之,你需要配置網格,使其擴展以填充可用空間,而不是手動指定寬度和高度。我已經修改了你的代碼來做到這一點。請注意,唯一以像素為單位的高度是在框架不應該擴展的時候,也就是在
標籤:self.left_frame. grid(row=0, column=0, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
self.main_frame. grid(row=1, column=0, padx=0, pady=0, sticky=tk.N tk.E tk.S tk.W)
self.left_frame.grid(row=0, column=0, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
使紅色框架展開以填充其網格單元
。
sticky方法的grid關鍵字引數。self.left_frame. grid(row=0, column=0, padx=5, pady=5, sticky='NESW' />)
'NESW'代表了 "北、東、南、西"。如果你愿意,你可以把它寫成:self.left_frame. grid(row=0, column=0, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
sticky=tk.S,那么框架將移動到其可用空間的底部。
移除不需要的空位
。
grid_rowconfigure和grid_columnconfigure的關鍵字引數weight。參見這里以獲得完整的解釋。top_frame的時候。
import tkinter as tk
class MyWindow。
def __init__(self, root: tk.Tk)。
w_root = 1280[/span
h_root = 720: root.
root.title('My model')
root.geometry(f"{w_root}x{h_root}")
self.top_frame = tk.Frame(root, height=80, bg='灰色')
self.top_frame.grid(row=0, column=0, padx=0, pady=5, sticky=tk.N tk.E tk.S tk.W)
self.main_frame = tk.Frame(root, bg='blue' )
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)
self.main_frame.grid(row=1, column=0, padx=0, pady=0, sticky=tk.N tk.E tk.S tk.W)
self.main_frame.grid_rowconfigure(0, weight=1)
self.left_frame = tk.Frame(self.main_frame, bg='red')
self.left_frame.grid(row=0, column=0, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
self.main_frame.grid_columnconfigure(0, weight=1)
self.right_frame = tk.Frame(self.main_frame, bg='yellow')
self.right_frame.grid(row=0, column=1, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
self.main_frame.grid_columnconfigure(1, weight=2)
self.lb_currdate = tk.Label(self.left_frame, text='my lable1:'/span>)
self.lb_currdate.config(font=('Arial', 9)
self.lb_currdate.grid(row=0, column=0, padx=5, pady=5)
self.ent_currdate = tk.Entry(self.left_frame)
self.ent_currdate.insert(tk.END, str(0)
self.ent_currdate.grid(row=0, column=1, padx=5, pady=5, sticky=tk.N tk.E tk.S tk.W)
self.left_frame.grid_columnconfigure(1, weight=1)
root = tk.Tk()
mywin = MyWindow(root)
root.mainloop()




