[英]Python: Tkinter open custom widget in new window
我的目標是生成一個帶有“NewWindow”按鈕的 window。 如果我按下按鈕,程序應該打開一個新的 window。我將這個 window 存儲在一個 class 的“NewWindow”中以快速重現它。 在這個“NewWindow”中,我有另一個按鈕。 如果我按下它,應該更新基本 window 的 label,並且應該自動關閉 window“NewWindow”。
這是我的代碼:
from tkinter import *
class NewWindow(Toplevel):
def __init__(self, master = None):
super().__init__(master = master)
self.title('NewWindow')
self.lb = Label(self, text='Hello')
self.lb.grid(column=0, row=0, columnspan=1)
self.bt1 = Button(self, text="apply Hello", command= self.bt_press)
self.bt1.grid(column=0, row=1)
def bt_press(self):
window.basic_lb.text = "Hello"
window = Tk()
def new_Editor():
a = NewWindow(window)
window.title("BasicWindow")
window.basic_lb = Label(window, text='None')
window.basic_lb.grid(column=0, row=0, columnspan=1)
window.basic_bt = Button(window, text="NewWindow", command=new_Editor)
window.basic_bt.grid(column=0, row=1)
window.mainloop()
問題:
您的代碼中有一些拼寫錯誤/錯誤導致了您的一些問題。 正如@Tim 所說,當您將 function 傳遞給command=function()
之類的命令時,它將在運行時調用,而不是在按下按鈕時調用。 您需要將 function 句柄傳遞給命令command=function
。 您通過在按鈕命令中使用 lambda function 來解決這個問題,但是只使用command=self.bt_press
會更容易
回答你的第二個問題, window.basic_lb.text = "Hello"
不是你如何改變 tkinter Label
中的文本,使用<Label>.config(text="Hello")
。 您還應該使用self.master
並在__init__
中定義self.master = master
而不是僅使用window
,因為雖然您可以訪問window
因為它沒有在本地 scope 中定義,所以最好顯式定義它。
您可以使用window.destroy()
關閉 window。
您的工作代碼現在是:
from tkinter import *
class NewWindow(Toplevel):
def __init__(self, master = None):
super().__init__(master = master)
self.title('NewWindow')
self.master = master
self.lb = Label(self, text='Hello')
self.lb.grid(column=0, row=0, columnspan=1)
self.bt1 = Button(self, text="apply Hello", command=self.bt_press)
self.bt1.grid(column=0, row=1)
def bt_press(self):
self.master.basic_lb.config(text="Hello")
self.destroy()
window = Tk()
def new_Editor():
a = NewWindow(window)
window.title("BasicWindow")
window.basic_lb = Label(window, text='None')
window.basic_lb.grid(column=0, row=0, columnspan=1)
window.basic_bt = Button(window, text="NewWindow", command=new_Editor)
window.basic_bt.grid(column=0, row=1)
window.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.