【问题标题】:Coding a general function to: Disable a tkinter widget with a checkbutton将通用功能编码为:禁用带有复选按钮的 tkinter 小部件
【发布时间】:2020-04-22 04:26:39
【问题描述】:

我正在尝试编写一个函数来根据检查按钮的值禁用 tkinter 程序中的小部件。我希望这个函数是通用的:也就是说,我可以将小部件和关联的检查变量传递给它,它将禁用小部件(如果以正确的方式检查变量)。

这是我的代码的抽象版本

import tkinter
class App:
    def __init__(self,root):
        widg = tkinter.Scale(root,from_=0,to=100)
        checkvar  = tkinter.IntVar()
        checker = tkinter.Checkbutton(root,variable=checkvar,command=self.check(var,checkvar))
        widg.grid()
        checker.grid()

        widg.configure(state=tkinter.DISABLED)
        widg.configure(state=tkinter.NORMAL)

    def check(self,widget,var):
        if var.get()==1:
            widget.configure(state=tkinter.DISABLED)
        elif var.get()==0:
            widget.configure(state=tkinter.NORMAL)


m = tkinter.Tk()
f=App(m)

它的作用是点击检查按钮触发回调 - 检查 - 使用小部件的参数和检查变量。然后它将评估小部件是否应该打开或关闭并相应地更改其状态。没有错误,但状态没有改变。我在这里想念什么?

谢谢

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    感谢我的朋友 JB 在这方面帮助我。

    正如用户 Axe319 建议的那样,问题只是 tkinter 不希望传递任何参数。可以通过使用 lambda 函数来解决此问题。在我原来的帖子第 8 行中定义 checker 变量的行可以重写为:

    self.checker = tkinter.Checkbutton(root,variable=checkvar,command=lambda:self.check(self.widg,checkvar))
    

    它会按预期工作。

    【讨论】:

      【解决方案2】:

      命令参数只接受未调用的函数,因此将参数传递给它需要一些解决方法。

      因此它期望self.check 而不是self.check(),因为小部件稍后会调用该函数。

      我发现使用 partial 是传递参数的一种解决方法。

      import tkinter
      from functools import partial
      
      class App:
          def __init__(self,root):
              widg = tkinter.Scale(root,from_=0,to=100)
              checkvar  = tkinter.IntVar()
              checker = tkinter.Checkbutton(root,variable=checkvar,command=partial(self.check, widg, checkvar))
              widg.grid()
              checker.grid()
      
              widg.configure(state=tkinter.DISABLED)
              widg.configure(state=tkinter.NORMAL)
      
          def check(self,widget,var):
              if var.get()==1:
                  widget.configure(state=tkinter.DISABLED)
              elif var.get()==0:
                  widget.configure(state=tkinter.NORMAL)
      
      
      m = tkinter.Tk()
      f=App(m)
      m.mainloop()
      

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 2019-03-22
        • 2022-06-18
        • 1970-01-01
        • 2011-09-15
        • 2015-02-23
        • 1970-01-01
        • 2013-02-12
        相关资源
        最近更新 更多