Tkinter更新状态(禁用):需要重绘/刷新?

时间:2015-09-15 08:44:35

标签: python tkinter disabled-input

我无法获得(tk。)标签和(tk。)Checkbutton的状态,视觉上转为禁用和正常,具体取决于OptionMenu的值。

下面对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

1 个答案:

答案 0 :(得分:0)

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

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

感谢所有人的帮助