我的應用程式應如下所示:
如果我在“左”按鈕處單擊 BasicWindow 并在“應用”按鈕處單擊 NewWindow(應該是單獨類中的某個小部件),在“左”按鈕下方的某個網格(4 列)的單元格中,應該出現單詞 hello . 如果我重復n次,新詞“你好”應該在“左”按鈕下方的網格中排列n次。
如果我在“右”按鈕處單擊 BasicWindow 并在“應用”按鈕處單擊 NewWindow,則在“左”按鈕下方的某個網格(4 列)的單元格中,應該出現單詞 hello。如果我重復n次,新詞“你好”應該在“右”按鈕下方的網格中排列n次。
該圖說明了程式應該做什么:

我只是試圖用以下代碼解決這個問題:
from tkinter import *
class NewWindow(Toplevel):
def __init__(self, master = None, apply=None):
super().__init__(master = master)
self.title('NewWindow')
self.master = master
self.words = 'Hello'
self.bt1 = Button(self, text="apply", command=self.bt_press)
self.bt1.grid(column=0, row=0)
self.apply = apply
def bt_press(self):
self.apply(self.words)
self.destroy()
window = Tk()
def new_Editor(key):
def make_label1(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=0,row=2)
def make_label2(lbl_txt):
lbl = Label(window, text=lbl_txt)
lbl.grid(column=2,row=2)
if key == 1:
a = NewWindow(window, make_label1)
else:
a = NewWindow(window, make_label1)
window.title("BasicWindow")
window.basic_bt_l = Button(window, text="Left", command=lambda: new_Editor(1))
window.basic_bt_l.grid(column=0, row=0, columnspan=2)
window.basic_bt_r = Button(window, text="Right", command=lambda: new_Editor(2))
window.basic_bt_r.grid(column=1, row=0)
window.mainloop()
我的程式如下所示:

由于某種原因,這兩個按鈕排列得不是很好,輸出的格式也不是很好。如何使用我上面描述的屬性在左右按鈕和左/右按鈕下方的兩個網格之間定義一些格式良好的網格?
uj5u.com熱心網友回復:
您columnspan=2在添加root.basic_bt_l到視窗時已指定,因此它將占據第 0 列和第 1 列。然后您嘗試放入root.basic_bt_r第 1 列,這將與第一個按鈕重疊。
有時,如果您將grid陳述句組合在一起,這些錯誤會更容易發現。注意columnspan這里的拇指是如何伸出來的,并且更容易可視化布局
root.basic_bt_l.grid(column=0, row=0, columnspan=2)
root.basic_bt_r.grid(column=1, row=0)
您需要洗掉columnspan=2以便按鈕不會重疊。
至于在新行上添加新詞,您需要計算在哪一行放置新標簽。在這種特定情況下,由于您將標簽垂直堆疊并且從不將它們從中間移除,您可以使用該grid_slaves方法告訴您有多少標簽。您可以將一個添加到該數字以獲取該列的第一個空行。您也可以只記錄為每列添加了多少標簽。
您還需要確保您呼叫make_label2- 您在陳述句make_label1的兩個條件中呼叫。if
def new_Editor(key):
def make_label1(lbl_txt):
print("root.grid_slaves(0):", root.grid_slaves(column=0))
row = len(root.grid_slaves(column=0)) 1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=0)
def make_label2(lbl_txt):
print("root.grid_slaves(1):", root.grid_slaves(column=1))
row = len(root.grid_slaves(column=1)) 1
lbl = Label(root, text=lbl_txt)
lbl.grid(row=row, column=1)
if key == 1:
a = NewWindow(root, make_label1)
else:
a = NewWindow(root, make_label2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425913.html
