【问题标题】:Tkinter update state (disable): need for redraw/refresh?Tkinter 更新状态(禁用):需要重绘/刷新?
【发布时间】:2015-09-15 08:44:34
【问题描述】:

我无法根据 OptionMenu 的值获取 (tk.)Label 和 (tk.)Checkbutton 的状态以直观地变为禁用和正常。

下面 OptionMenu 上的命令绑定看起来不错,但我在 updateState() 中使用 configure(state=...) 没有明显效果。我应该强制一些“刷新”或“重绘”(如果是的话,在下面的部分代码中如何?)还是我错过了其他东西?

import Tkinter
from Tkinter import Frame, LabelFrame, Label, Entry, Button, StringVar, OptionMenu, Checkbutton, IntVar, DISABLED, NORMAL

class GeneratorDialog:

  # The UI to configure the settings by the user
  def __init__(self, root, ctrl):
    self.__root = root
    self.__ctrl = ctrl

  def updateState(self, value, label, entry):
    if(value.get()==CONST.FORMAT_PDF): # test works, as the dialog below show in alternance as expected
        tkMessageBox.showinfo('Info', message="enabling checkbox")
        label.configure(state=NORMAL)
        entry.configure(state=NORMAL)
    else:            
        tkMessageBox.showinfo('Info', message="disabling the checkbox")
        label.configure(state=DISABLED)
        entry.configure(state=DISABLED)
    #self.__root.update_idletasks() # how to force "redraw" with grid() manager?


  def show(self):
    self.__root.title(CONST.APP_NAME)
    mainFrame = Frame(self.__root)
    mainFrame.grid(sticky='ew')
    outputFrame = LabelFrame(mainFrame, text='Output Settings')
    outputFrame.grid(column=0, row=1, padx=5, pady=5, sticky='ew')


    keepGeneratedScribusFilesLabel = Label(outputFrame, text='Keep Scribus Files:', width=15, anchor='e')
    keepGeneratedScribusFilesLabel.grid(column=4, row=2, padx=5, pady=5, sticky='e')
    keepGeneratedScribusFilesCheckbox = Checkbutton(outputFrame, variable=self.__ctrl.getKeepGeneratedScribusFilesCheckboxVariable(), anchor='w')
    keepGeneratedScribusFilesCheckbox.grid(column=5, row=2, padx=5, pady=5, sticky='w')

    mergeOutputLabel = Label(outputFrame, text='Merge in Single File:', width=15, anchor='w')
    mergeOutputLabel.grid(column=0, row=2, padx=5, pady=5, sticky='w')
    mergeOutputCheckbox = Checkbutton(outputFrame, variable=self.__ctrl.getMergeOutputCheckboxVariable())
    mergeOutputCheckbox.grid(column=1, row=2, padx=5, pady=5, sticky='w')  

    outputFormatLabel = Label(outputFrame, text='Output Format:', anchor='e')
    outputFormatLabel.grid(column=2, row=2, padx=5, pady=5, sticky='e')
    outputFormatListBox = OptionMenu(outputFrame, self.__ctrl.getSelectedOutputFormat(), *self.__ctrl.getOutputFormatList(),
        command=lambda l=keepGeneratedScribusFilesLabel, c=keepGeneratedScribusFilesCheckbox, v=self.__ctrl.getSelectedOutputFormat(): self.updateState(v, l, c))
    outputFormatListBox.grid(column=3, row=2, padx=5, pady=5, sticky='w')            


    # Buttons to Cancel or to Run the Generator with the given Settings
    helpButton = Button(buttonFrame, text='Help', width=10, command=self.__ctrl.helpButtonHandler)
    helpButton.grid(column=0, row=0, padx=5, pady=5, sticky='e')
    cancelButton = Button(buttonFrame, text='Cancel', width=10, command=self.__ctrl.buttonCancelHandler)
    cancelButton.grid(column=1, row=0, padx=5, pady=5, sticky='e')
    generateButton = Button(buttonFrame, text='Generate', width=10, command=self.__ctrl.buttonOkHandler)
    generateButton.grid(column=2, row=0, padx=5, pady=5, sticky='e')

    # Finally show the Generator Dialog
    mainFrame.grid()
    self.__root.grid()
    self.__root.mainloop()

完整代码在https://github.com/berteh/ScribusGenerator/blob/93a12de4be28054344533ad8fc424e37180668de/ScribusGenerator.py#L278

【问题讨论】:

  • 您需要提供一个minimal reproducible example 才能重现您的问题。一个独立的程序。
  • 添加要更改的列表项。创建一个会改变的函数。如果您在应用程序中不使用命名空间,则必须使用列表或字典。
  • 您能否提供一个可运行的问题示例。我无法重现您的问题。因此,要回答您的问题,您无需在更改标签状态后更新标签。
  • 在对话框中调用mainloop 很奇怪。您不是已经为整个程序运行了mainloop 吗?
  • @Berteh:你不应该有超过一个 mainloop 运行,但如果你只调用一次,那没关系。

标签: python tkinter disabled-input


【解决方案1】:

通过使用类变量 (self.X) 而不是 lambda 局部变量来解决它。

仍然不知道为什么以前的代码(在 lambda 中有局部变量)不会更新 Tk 元素的状态(也许它创建了它的副本?)...但我找到了解决方法。

感谢大家的帮助

【讨论】:

  • 作为一般经验法则,恕我直言,我认为应该避免使用 lambda。除非您真的需要它们,否则它们会增加复杂性而不会提供任何实际好处
猜你喜欢
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多