【问题标题】:Hide a Button in Tkinter在 Tkinter 中隐藏按钮
【发布时间】:2019-04-14 19:57:03
【问题描述】:

我想隐藏一个 tkinter 按钮,但不是在用户单击它时。我只是想随机隐藏它。我将如何在 Python 中做到这一点?下面是我试过的代码:

self.startGame = Button(self.canvas, text="Start", background='white', command = self.startGame, font=("Helvetica"))
self.startGame.place(x=770, y=400)

隐藏它:

 self.startGame.bind('<Button-1>', self.hide_me)

 def hide_me(self, event):
    print('hide me')
    event.widget.pack_forget()

它甚至没有进入 hide_me 函数。

【问题讨论】:

  • .pack_forget() 不会对 .pack() 最初不可见的小部件做任何事情。您需要改用.place_forget()
  • 您的按钮名称 self.startGame 并且它链接到一个名为 self.startGame 的函数。这可能就是为什么它没有进入 hide_me。上面 jasonharper 的回答解释了 hide_me 一旦你到达它就不会做的事情。
  • @DaveMaheux 命令只是链接回按钮,这实际上并没有阻止bind() 激活hid_me。当他们将pack_forget() 更改为place_forget() 时,此代码将起作用。但是我同意command=self.startGame 在这里是错误的。

标签: python python-3.x user-interface button tkinter


【解决方案1】:

正如 cmets 中所指出的,对于使用 place() 在屏幕上设置的小部件,您应该使用 place_forget()

pack()grid() 也是如此。您将分别使用pack_forget()grid_forget()

这是您的代码的修改示例。

import tkinter as tk

class Example(tk.Tk):
    def __init__(self):
        super().__init__()
        canvas = tk.Canvas(self)
        canvas.pack()
        self.startGame = tk.Button(canvas, text="Start", background='white', font=("Helvetica"))
        self.startGame.place(x=150, y=100)
        self.startGame.bind('<Button-1>', self.hide_me)

    def hide_me(self, event):
        print('hide me')
        event.widget.place_forget()

if __name__ == "__main__":
    Example().mainloop()

也就是说你不需要在这里绑定。只需在命令中使用 lambda 语句,如下所示:

import tkinter as tk

class Example(tk.Tk):
    def __init__(self):
        super().__init__()
        canvas = tk.Canvas(self)
        canvas.pack()
        self.startGame = tk.Button(canvas, text="Start", background='white', font=("Helvetica"),
                                   command=lambda: self.hide_me(self.startGame))
        self.startGame.place(x=150, y=100)

    def hide_me(self, event):
        print('hide me')
        event.place_forget()

if __name__ == "__main__":
    Example().mainloop()

【讨论】:

  • 再显示一次怎么样?它对应的代码是什么?
  • @Eliyah 我相信对于所有几何管理器来说,如果您只是在小部件上调用 place(),它将被放回到原来的窗口上。 grid()pack() 相同。
  • 似乎并非如此,至少对于pack 而言。它位于小部件列表的末尾(例如底部)
  • @Osman-pasha pack() 有点不同,因为它没有像地点和网格这样的定义位置。
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 2021-01-31
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多