繁体   English   中英

Python:Tkinter 在新的 window 中打开自定义小部件

[英]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()

问题:

  1. 开始时显示 windows NewWindow 和 BasicWindow。 我只想打开 BasicWindow,单击 basic_bt 按钮后应打开 NewWindow。 我该如何解决? (已经通过下面的commed解决了)
  2. 为什么 basic_lb 中的 label 文本在按下 self.bt1 后没有得到一些更新?
  3. 如何使用 bt_press 方法关闭 NewWindow?

您的代码中有一些拼写错误/错误导致了您的一些问题。 正如@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM