【问题标题】:How to temporarily remove (not delete and replace) Tkinter widget without using just .place?如何在不使用 .place 的情况下临时删除(而不是删除和替换)Tkinter 小部件?
【发布时间】:2014-12-06 17:23:15
【问题描述】:

我希望这不是重复的,但我在任何地方都找不到:

我已经使用 Tkinter 编写应用程序有一段时间了(其中甚至有 2 个游戏,但我现在使用 Pygame。)

我的问题是,我会怎么做一个“.pack”然后“.unpack”(临时删除)而不使用“.place( x = someLARGE_Number, y = anotherLARGE_Number )”的肮脏把戏

例如: root = Tk()

root.geometry( "300x300" )
root.title( "Test" )

label1 = Label( root, text = "Hi" )
label1.place( x = 1, y = 1 )

root.mainloop()

当我删除它时,它是临时的。我输入如下内容:

label1.place( x = 3333, y = 3333 )

我知道pack和unpack存在,但是你不能打开一个已经放置的对象,也不能使用pack精确放置一个项目,那么我怎样才能更整洁地删除它呢?它在代码上看起来很糟糕,并且可能将很多东西放在一边或屏幕上,有时一次几乎看不到移动 1。如果这是重复的,请发表评论以提供帮助,但我找不到类似的内容。

重述:

问题: 临时移除项目的干净方法,不破坏它或使用带有一对大屏幕外数字的 .place() 方法。

尝试过: .place( x = LARGE, y = LARGE ) 就是这样,.unpack 需要一些东西是 .pack(ed) 并且你不能(据我所知)通过 .pack 将物品放置在你想要的地方。

需要:帮助或指向像我这样的已回答问题的链接!

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您可以查询小部件是否与几何管理器(gridpackplace)“映射”,然后根据需要“忘记”它:

    def unmap(widget):
        result = False
        if widget and widget.winfo_exists() and widget.winfo_ismapped():
            result = True
            geom_mgr = widget.winfo_manager()
            if geom_mgr == 'grid':
                widget.grid_forget()
            elif geom_mgr == 'pack':
                widget.pack_forget()
            elif geom_mgr == 'place':
                widget.place_forget()
            else:
                result = False
        return result            
    

    请注意,调用与映射例程不匹配的“忘记”例程不会引发异常。因此,如果您 pack() 一个小部件,您可以在该小部件上调用 grid_forget() 而不会导致错误或产生任何影响。在这种情况下,只有pack_forget() 会隐藏小部件。

    【讨论】:

      【解决方案2】:

      使用.place_forget() 方法,该方法与您在创建小部件时选择的“geometry-manager”类型相关联:

      label1.place_forget()
      

      之后,你可以通过再次放置让它再次出现:

      label1.place(x=1, y=1)
      

      请注意,使用.place() / .place_forget() 几何管理器并不总是有益的。

      您也可以将 .grid() / .grid_forget().pack() / .pack_forget() 方法用于其他几何管理器,其中网格排列或包布局更适合您的 GUI 设置/配置/调整大小需求。

      可以检查所有实例方法的文档字符串属性.__doc__

      >>> print label.place_forget.__doc__
      Unmap this widget.
      >>> print label.grid_forget.__doc__
      Unmap this widget.
      >>> print label.pack_forget.__doc__
      Unmap this widget and do not use it for the packing order.
      

      【讨论】:

      • 我认为您可能搞砸了,但是“放置几何管理器。使用网格或放置”您是否制作了“使用网格或包装”?如果是这样,我将如何准确放置它(AKA 使用坐标?)
      • 是的,我的意思是packgrid。此外,它们还引入了完全不依赖坐标的其他系统。对于复杂和可调整大小的内容,这些更灵活且更易于使用。阅读更多关于他们的信息here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多