gpt4 book ai didi

python - tkinter 返回动态复选框的名称

转载 作者:行者123 更新时间:2023-12-01 08:45:31 25 4
gpt4 key购买 nike

我正在尝试用 python 和 tkinter 编写我的第一个脚本。

当我需要获取单击按钮验证时所选的每个复选框的名称变量时,我被阻止了,我迷失了。

复选框是由文本文件动态生成的。示例文件:

item1
item2
...
item100

GUI 屏幕:

screenshot showing checkbuttons and validate button

这是我的代码:
(在 # 代码中是我尝试过但没有成功的代码。)

from tkinter import *
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

def __init__(self):
super().__init__()

self.initUI()

def initUI(self):

self.master.title("My Menu")

menubar = Menu(self.master)
self.master.config(menu=menubar)

fileMenu = Menu(menubar)

submenu = Menu(fileMenu)
submenu.add_command(label="lst1", command=self.onDisplay)
submenu.add_command(label="lst2")
submenu.add_command(label="lst3")
fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

fileMenu.add_separator()

fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
menubar.add_cascade(label="File", underline=0, menu=fileMenu)

## Here the function which display checkboxes
def onDisplay(self):
self.pack(fill=BOTH, expand=True)
frame1 = Frame(self)
frame1.pack(fill=BOTH)
lbl1 = Label(frame1, text="Choice", width=6)
path = '/root/liste/*.txt'
files=glob.glob(path)
count = 0
#var = dict()
for file in files:
with open(file, 'r') as lst_file:
for item in lst_file:
#var[item]=IntVar()
#cb = Checkbutton(frame1, text=item.rstrip(), variable=var[item], command=self.cb)
##Here all checkboxes generated dynamically
cb = Checkbutton(frame1, text=item.rstrip())
cb.grid(row=count//10, column=count%10)
#cb.pack()
count += 1
#btn1 = Button(self, text='Validate', font=("Arial", 12), command=self.cb)
btn1 = Button(self, text='Validate', font=("Arial", 12))
btn1.pack(side=RIGHT, padx=5)

def cb(self):
print("variable is", self.var.get())

def onExit(self):

self.quit()

def main():

root = Tk()
root.geometry("800x550+300+300")
app = Example()
root.mainloop()


if __name__ == '__main__':
main()

最佳答案

我无法弄清楚您的代码在处理多个文件方面尝试执行的所有操作,但下面显示了它的清理后的功能版本,显示了跟踪哪个Checkbutton 已被用户选择。

大多数重要的更改都是针对 onDisplay() 方法的,尽管我还更改了 def cb(self): 方法的名称,您必须def validate(self): 以匹配 Button 名称(因为我发现调用它 cb 很困惑,因为这也是 中局部变量的名称>onDisplay())。

from tkinter import *
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

def __init__(self):
super().__init__()
self.initUI()

def initUI(self):

self.master.title("My Menu")

menubar = Menu(self.master)
self.master.config(menu=menubar)

fileMenu = Menu(menubar)

submenu = Menu(fileMenu)
submenu.add_command(label="lst1", command=self.onDisplay)
submenu.add_command(label="lst2")
submenu.add_command(label="lst3")
fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

fileMenu.add_separator()

fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
menubar.add_cascade(label="File", underline=0, menu=fileMenu)

## Here is the function which displays checkboxes
def onDisplay(self):
self.pack(fill=BOTH, expand=True)
frame1 = Frame(self)
frame1.pack(fill=BOTH)
lbl1 = Label(frame1, text="Choice", width=6)
# path = '/root/liste/*.txt'
path = './root_liste1.txt' # changed for my testing.
files=glob.glob(path)

self.var = dict()
count = 0
for file in files:
with open(file, 'r') as lst_file:
for item in lst_file:
item = item.rstrip()
status = BooleanVar()
self.var[item] = status
cb = Checkbutton(frame1, text=item, variable=status)
cb.grid(row=count//10, column=count%10)
count += 1

btn1 = Button(self, text='Validate', font=("Arial", 12),
command=self.validate)
btn1.pack(side=RIGHT, padx=5)

def validate(self): # btn1 callback
print('checked items:')
for item, status in self.var.items():
if status.get(): # Checked?
print(' ', item)

def onExit(self):
self.quit()

def main():
root = Tk()
root.geometry("800x550+300+300")
app = Example()
root.mainloop()


if __name__ == '__main__':
main()

关于python - tkinter 返回动态复选框的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53328208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com