[英]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.