Python:Tkinter在新窗口中打开自定义小部件



我的目标是生成一个带有按钮的窗口"NewWindow";如果我按下按钮,程序应该会打开一个新窗口。这个窗口我存储在一个类";NewWindow";以快速复制它。在这个";NewWindow";我还有一个按钮。如果我按下它,基本窗口的标签应该被更新;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()

问题:

  1. 启动时,会同时显示窗口NewWindow和BasicWindow。我只想打开BasicWindow,单击按钮basic_bt后应该打开NewWindow。我该如何解决?(已通过以下命令解决(
  2. 为什么按下self.bt1后,basic_lb中的标签文本没有得到更新
  3. 如何使用bt_press方法关闭NewWindow

您的代码中有一些拼写错误/错误,导致了一些问题。正如@Tim所说,当您将函数传递给像command=function()这样的命令时,它将在运行时被调用,而不是在按下按钮时被调用。您需要将函数句柄传递给命令command=function。您可以通过在按钮命令中使用lambda函数来解决这个问题,但只使用command=self.bt_press更容易

在回答第二个问题时,window.basic_lb.text = "Hello"不是如何更改tkinter中的文本Label,而是使用<Label>.config(text="Hello")。您还应该使用self.master并在__init__中定义self.master = master,而不仅仅是使用window,因为虽然您可以访问window,因为它没有在本地范围中定义,但最好显式定义它。

您可以使用window.destroy()关闭窗口。

您的工作代码现在是:

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()

最新更新