tkinter:修改隐藏窗口小部件的属性 - 窗口小部件不会隐藏(python 3.6)

时间:2018-01-31 16:56:14

标签: python tkinter

我在 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()行并不是一个真正的选择。

1 个答案:

答案 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”行修复了我的问题。