我在 Frame 小部件上使用.grid_remove()
(隐藏框架内的所有小部件),并且必须更新隐藏小部件的属性,而不用那些小部件是自动化的
显示。 (BTW使用.grid_forget()
似乎没有改变。)我似乎记得读过这个"显示更新"行为是有意的(这是有道理的),但我如何阻止它发生?
我忽略了一些明显的东西吗?是否可以在可隐藏框架内的所有小部件上使用.grid_remove()
?
背景:
这适用于具有多种操作模式的多语言应用程序。根据用户模式,必须隐藏一些小部件。当用户选择一种语言(使用GUI)时,每个小部件(包括隐藏的小部件)的text
属性必须相应地更改,从而导致隐藏的小部件(在某些操作中不合适)模式)出现在显示屏上。
以下伪代码显示事件序列。启动时(确定操作模式):
UserMode = RestrictedMode
WidgetTitle = 'This restricted mode widget is invisible'
Ghost_Frame = LabelFrame( ParentFrame )
Ghost_Frame.grid()
GhostWidget = LabelFrame( Ghost_Frame ) # widget type doesn't matter
GhostWidget.grid()
GhostWidget[ 'text' ] = WidgetTitle # or GhostWidget.configure( text = WidgetTitle )
if ( UserMode == RestrictedMode ) :
Ghost_Frame.grid_remove( ) # hide frame and GhostWidget
一切都按预期工作(GhostWidget
没有出现) - 直到用户使用GUI选择语言,导致执行此操作:
WidgetTitle = 'The restricted mode widget is now visible'
GhostWidget[ 'text' ] = WidgetTitle
这会导致GhostWidget
对受限制的用户显示,而不是保持隐藏状态。请注意,暂时注释掉上述行会消除(隐藏?)问题。
最后,在我的情况下,由于涉及的提示,模式和模块的数量,根据用户模式有条件地执行.grid_remove()
行并不是一个真正的选择。
答案 0 :(得分:0)
事实证明,我带领自己沿着花园小径走下去,陷入了陷阱。我在这里发布原因,以便其他人可以从我的不幸中获益。
与所有其他小部件不同,使用.grid_remove()不会隐藏问题小部件。相反,通过将受影响的窗口小部件的颜色属性设置为当前的“透明”颜色(即父框架的背景颜色),使得它们变得“不可见”,例如,
Ghost_FRAME = LabelFrame( ParentFrame, background = 'gold' )
TransparentColour = Ghost_FRAME[ 'background' ]
GhostWidget = Label( Ghost_FRAME, text = 'Dead parrot', background = TransparentColour )
GhostWidget [ 'foreground' ] = TransparentColour
在金色背景上的黄金小部件上创建黄金(前景)文本,使小部件有效地不可见。 (这是故意和期望的行为,取决于启动模式。)然而,当一个不同的选项(语言)被改变时,问题小部件的一些颜色属性也被改变而不管启动模式如何,从而使得小部件突然可见 - 并且给了我错误的印象是grid_remove没有正常运作。
用grid_remove()替换那些“invisibilty”行修复了我的问题。