【问题标题】:Checking state of checkbutton from dynamic list从动态列表中检查检查按钮的状态
【发布时间】:2016-12-12 22:56:26
【问题描述】:

我有一个基于查询生成的复选按钮列表 - 它根据搜索条件填充,并且能够通过第二次搜索和/或清除列表来销毁。我还将检查按钮的值存储在列表 (todoList) 中。我苦苦挣扎的地方是如何检查是否在“提交”功能中选择了复选按钮。以下是包含 todoList 操作的检查按钮的生成方式。我的逻辑中肯定遗漏了一些东西,我可以动态获取值,但我没有看到它,需要一点帮助。

  while data:
    specno = data[0]
    fname = data[1]
    lname = data[2]
    self.todoList.append(specno)
    #self.var1 = IntVar()
    n = len(self.buttonList)
    lx = Checkbutton(self.listFrame,
                     text=self.todoList[n],
                     variable=self.todoList[n],
                     onvalue = 1,
                     offvalue = 0)
    ni = n
    self.buttonListNum.append(ni)
    lx.grid(row=n, column=0, sticky='NW')
    self.buttonList.append(lx)
    data = cursor.fetchone()

【问题讨论】:

  • variable= 期望 StringVar()IntVar() 等。当您选中检查按钮时,它会更改 StringVar()/IntVar() 中的值。所以你可以检查这个StringVar()/IntVar()
  • 我想这就是我失败的地方 - 如果我将语句更改为 variable = IntVar() - 我以后如何检查所有检查按钮的值?

标签: python tkinter


【解决方案1】:

所以我想出了如何处理这个问题 - 因为状态检查需要 checkbutton 的变量属性是 IntVar()、StrVar() 等,所以我所做的是将变量设置为 IntVar() 然后追加将它们添加到与我的 buttonList[] 和 todoList[] 列表具有相同索引的单独列表中,以便稍后我可以使用下面显示的函数 checkStatus 检查状态。

def add(self):
  self.removeCheckButton()
  entry = self.entryBox.get()
  self.entryBox.delete(0, END)
  search = ("%QUERY%")
  cursor.execute(search)
  data = cursor.fetchone()
  while data:
    specno = data[0]
    fname = data[1]
    lname = data[2]
    self.todoList.append(specno)
    var = IntVar()
    n = len(self.buttonList)
    lx = Checkbutton(self.listFrame,
                     text=self.todoList[n],
                     variable= selvar,
                     onvalue = 1,
                     offvalue = 0)
    ni = n
    self.buttonListNum.append(ni)
    self.varList.append(var)
    lx.grid(row=n, column=0, sticky='NW')
    self.buttonList.append(lx)
    data = cursor.fetchone()


def checkStatus(self):
  for i in self.buttonListNum:
    print(self.varList[i].get())

【讨论】:

  • buttonListNum 没用 - 你可以这样做 for x in self.varList: print(x.get()) 如果你需要它的索引然后使用 enumerate - for i, x in enumerate(self.varList): print(i, x.get())
【解决方案2】:

你的代码更简洁

  • 你可以使用for 代替while 然后你就不需要data = cursor.fetchone()
  • 你不需要self.buttonListNum
  • 您不必在名称中添加Listbuttonsvars 更具可读性。如果你想要List 的名字,那么首选button_listvar_list

.

for n, data in enumerate(cursor):
    specno = data[0]
    var = IntVar()

    lx = Checkbutton(self.listFrame,
                     text=specno,
                     variable=var,
                     onvalue=1,
                     offvalue=0)
    lx.grid(row=n, column=0, sticky='NW')

    self.todoList.append(specno)
    self.buttons.append(lx)
    self.vars.append(var)

并检查变量:

def check_status(self):
    for i, var in enumerate(self.vars):
        print(i, var.get())

【讨论】:

  • 我确实需要 buttonListNum 来实现我没有显示的不同功能,但这与这里的问题无关,所以你是对的 - 我应该从我的示例代码中删除它。感谢您的帮助!
  • 对我来说buttonListNum 是没用的——它有值[0,1, 2, 3, .. , n-1]。您可以使用 list(range(n)) 获得相同的值,其中 n = len(buttonList)n = len(vars) 。但大多数情况下,我们使用enumerate(some_list) 来获取这些值。
猜你喜欢
  • 2020-11-22
  • 2017-03-08
  • 2019-09-27
  • 2013-09-20
  • 2015-07-27
  • 2018-10-08
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
相关资源
最近更新 更多