【问题标题】:Tkinter: checkbox list not responsiveTkinter:复选框列表没有响应
【发布时间】:2018-06-22 15:35:17
【问题描述】:

我正在尝试创建一个带有循环的复选框列表。我已经修改了其他人的代码的实现,它使用相同的概念并且应该具有与我想要的相同的功能。当我尝试打印每个复选框的状态时,它们都没有更新为 1。即使我单击它们,它们都保持在 0。

这是我的代码,test() 函数的行为与我预期的不同。

import tkinter
import tkinter.filedialog
import os

def browse():
    filez = tkinter.filedialog.askdirectory(parent=window, title='Choose a file')

    ent1.insert(20, filez)

    dirs = os.listdir(filez)

    # remove previous IntVars
    intvar_dict.clear()

    # remove previous Checkboxes
    for cb in checkbutton_list:
        cb.destroy()
    checkbutton_list.clear()
 
    for filename in dirs:
        # create IntVar for filename and keep in dictionary
        var = tkinter.IntVar()

        # create Checkbutton for filename and keep on list
        c = tkinter.Checkbutton(window, text=filename, variable=var)
        c.pack()
        intvar_dict[filename] = var
        checkbutton_list.append(c)

def test():
    for key, value in intvar_dict.items():
        if value.get() > 0:
            print("HIIIIII")
        print('selected:', key)
        #print (value.get())


# to keep all IntVars for all filenames
intvar_dict = {}
 # to keep all Checkbuttons for all filenames
checkbutton_list = []

window = tkinter.Tk()

lbl = tkinter.Label(window, text="Path")
lbl.pack()

ent1 = tkinter.Entry(window)
ent1.pack()

btn1 = tkinter.Button(window, text="Select Path", command=browse)
btn1.pack()

btn1 = tkinter.Button(window, text="Test Checkboxes", command=test)
btn1.pack()

window.mainloop()

【问题讨论】:

  • 试用了您的代码。当我单击“测试复选框”时,它会为我勾选的每个复选框打印“HIIIIII”,而对于我没有勾选的复选框则不会打印。这不是你正在发生的事情吗?
  • 您的代码在我这边按预期工作。我在循环中添加了一个打印语句来检查value.get() 的值,我选择的那些被更改为1
  • 如果这没有发生在你这边,我认为这不是你的代码的问题,而是一个错误。你用的是什么版本的python/OS?
  • 感谢您观看这些家伙。我想我可能是一个错误,我会调查它。它仍然无法按预期工作。我在 Python 3.6
  • 您是否在 QtConsole 之类的解释器中运行此代码?因为如果我直接运行您的代码,它可以工作,但不能来自 QtConsole。为了让它工作,我需要指定IntVarvar = tkinter.IntVar(master=window))的主人。

标签: python checkbox tkinter checkboxlist


【解决方案1】:

如果直接执行此代码可以完美运行,但是如果从 QtConsole 运行代码,则会出现问题中描述的问题。这个问题可以通过指定IntVar的master:var = tkinter.IntVar(master=window)来解决。

确实,QtConsole 会自动创建一个Tk 实例,所以当window 创建时,有两个Tk 实例。然后,当 IntVar 创建时,tkinter 将其链接到第一个 Tk 实例,即不是 Checkbutton 的主实例。由于CheckbuttonIntVar 不属于同一个Tk 实例(即不同的Tcl 解释器),它们无法通信。这就是变量的值与复选框的状态不对应的原因。

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2019-04-16
    • 2016-01-10
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2014-07-28
    相关资源
    最近更新 更多