【问题标题】:Toggling a tkinter window open using shortcut使用快捷方式打开 tkinter 窗口
【发布时间】:2019-05-23 22:15:17
【问题描述】:

我远不是经验丰富的程序员/脚本编写者,这是我第一个包含 UI (tkinter) 的项目。

我的键盘上有一个键绑定到一个打开窗口的函数。 我正在使用类似的东西将其绑定到密钥:

root.bind('<s>', popupmsg)

这是我正在调用的函数:

def popupmsg(msg):
    global MSGroot
    MSGroot = Tk()

    lab1.config("test")
    lab1= Label(MSGroot, font=('times', 40), bg='blue', fg="red")
    lab1.grid(row=0, column=1)

    MSGroot.title("TIME")
    MSGroot.call('wm', 'attributes', '.', '-topmost', '1')
    MSGroot.mainloop()

这段代码可以工作并且可以很好地显示窗口,但是我想找到一种优雅的方法来使用相同的键绑定来简单地打开和关闭该窗口。

有什么建议吗?

【问题讨论】:

    标签: python tkinter window toggle python-3.7


    【解决方案1】:

    我会提出许多建议,这将使您的代码更好/更优雅。

    首先,不要使用Tk() 窗口作为弹出窗口,使用 TopLevel()窗口,两个Tk()窗口不能传递信息 彼此之间,因此请改用TopLevel() 窗口。

    def popupmsg(msg):
            global MSGroot
            MSGroot = TopLevel(root) # needs the main Tk() window as a master/parent element
    
            lab1.config("test")
            lab1= Label(MSGroot, font=('times', 40), bg='blue', fg="red")
            lab1.grid(row=0, column=1) 
    
            MSGroot.title("TIME")
            MSGroot.call('wm', 'attributes', '.', '-topmost', '1')
    

    其次,您应该创建类以使您的TkTopLevel windows,这只是更好地格式化您的代码,而且更多 用于更改窗口的工作方式。

    class PopUpMsg(Toplevel):
    
        def __init__(self, master, msg):
            super(PopUpMsg, self).__init__(master)
    
            lab1 = Label(self, font=('times', 40), bg='blue', fg="red")
            lab1.grid(row=0, column=1)
    
            self.title("TIME")
            self.call('wm', 'attributes', '.', '-topmost', '1')
    
    
    # This is now the function you could use to show the popup
    def popupmsg(msg): 
        test_popup = PopUpMsg(root, msg) # This is how you would create the PopUpMsg
        test_popup.pack()
    
    
    root = Tk()
    root.mainloop()
    

    最后做到这一点,当你按“s”时窗口会关闭 我会再次为这个新的PopUpMsg 类创建一个on_close 方法, 并将“s”绑定到它。

    class PopUpMsg(Toplevel):
    
        def __init__(self, master):
            super(PopUpMsg, self).__init__(master)
    
            lab1 = Label(self, font=('times', 40), bg='blue', fg="red")
            lab1.grid(row=0, column=1)
    
            self.title("TIME")
            self.bind('<s>', self.on_close)
    
        def on_close(self):
            self.destroy()
    

    【讨论】:

    • 您通常不应多次致电mainloop
    • @BryanOakley 感谢接机,忘记删除那行
    • 非常感谢您提供的知识!我不知道一些最佳实践,我对此很陌生,这非常有帮助。如果我未能实现这一点,将回到这里。欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多