【问题标题】:Getting text of a checkbutton from the variable in tkinter从 tkinter 中的变量获取检查按钮的文本
【发布时间】:2020-06-17 14:10:16
【问题描述】:

我在这里创建检查按钮:

var = []
k=0
for i in results:
    var.append(IntVar())
    Checkbutton(frame, text = i[0], variable = var[k], wraplength=500).pack()
    k+=1

在这里,我已经获得了每个复选按钮的变量,并想打印被选中的复选按钮的文本:

# function is called when a button is clicked
def delHist():
    for i in range(len(var)):
        if var[i].get()==1:      # checking if the checkbutton is checked
            # want to print the text in the checkbutton here

如何仅使用变量打印该复选按钮的文本?

编辑: 这里的问题似乎是相似的: How to get the text from a checkbutton in python ? (Tkinter)

我尝试将Checkbutton(frame, text = i[0], variable = var[k], wraplength=500).pack() 分配给列表ch[p],以便在迭代时将其分配给一个新对象。当我在函数下添加print ch[p].get() 时,出现错误。 我也试过print ch[p].get('text'),但我得到了错误

TypeError: "get()" 接受 1 个位置参数,但给出了 2 个

【问题讨论】:

标签: python python-3.x tkinter tkinter.checkbutton


【解决方案1】:

如果您将onvalue 设置为与文本相同的值(或您想要的任何值),则该变量将包含该值或空字符串。

你需要先从IntVar切换到StringVar,然后设置onvalueoffvalue

var.append(StringVar())
buttons.append(Checkbutton(tk, text = i[0], variable = var[k], wraplength=500, onvalue=i[0], offvalue=""))

接下来,您可以修改delHist 以简单地打印非空字符串的值:

def delHist():
    for variable in var:
        value = variable.get()
        if value:
            print(value)

【讨论】:

    【解决方案2】:

    如果我理解正确(在 cmets 中纠正我),这就是您需要的:

    from tkinter import *
    
    tk = Tk()
    
    var = []
    buttons = []
    k=0
    def delHist():
        for i in range(len(var)):
            if var[i].get()==1:
                print(buttons[i]['text'])
    for i in 'abcde':
        var.append(IntVar())
        buttons.append(Checkbutton(tk, text = i[0], variable = var[k], wraplength=500))
        buttons[-1].pack()
        k+=1
    
    Button(text='delHist', command=delHist).pack()
    

    请注意,我将Checkbutton(...) 附加到列表中,而不是Checkbutton(...).pack(),然后运行.pack() 方法。原因是第一个返回 Checkbutton 对象,而第二个返回 NoneType - 这不是 jQuery。 希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      Tkinter是 OOP,因此发生相反的情况。
      扩展 tk.Checkbutton 对象并忘记 variable=tk.IntVar()
      扩展的Checkbutton 知道他的text=checked 状态。

      import tkinter as tk
      
      
      class Checkbutton(tk.Checkbutton):
          def __init__(self, parent, **kwargs):
              self._var = tk.IntVar()
              # kwargs['variable'] = self._var
              super().__init__(parent, variable=self._var, **kwargs)
      
          @property
          def checked(self):
              return self._var.get() == 1
      
          def __str__(self):
              return f"Checkbutton: {self['text']}={self.checked}"
      

      用法:

      class App(tk.Tk):
          def __init__(self):
              super().__init__()
      
              self.frame = tk.Frame(self)
              self.frame.pack()
              for text in ('option 1', 'option 2', 'option 3'):
                  Checkbutton(self.frame, text=text, wraplength=500).pack()
      
              tk.Button(self, text='Show Checkbutton state', command=self.on_button_click).pack()
      
          def on_button_click(self):
              for ckb in self.frame.children.values():
                  print(ckb)
      
      if __name__ == '__main__':
          App().mainloop()
      

      输出:

      Checkbutton: option 1=False
      Checkbutton: option 2=True
      Checkbutton: option 3=False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 2019-07-10
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 2023-03-18
        • 2021-08-14
        相关资源
        最近更新 更多