我在这里的第一个问题.切中要害.我想用包含多组单选按钮的tkinter实现一个界面.每组将有三个单选按钮(好、正常、差).在代码执行后,用户将 Select 他想要的单选按钮,最后他按下一个按钮来收集所有单选按钮的值,这样我们就可以有一个统计视图,假设 Select 了多少个单选按钮.以上所有内容都应该尽可能动态地实现.
我试过的东西. 我使用发电机进行以下操作:
- 一排排标签.
- 一排排单选按钮.
- 变量=var应采用的名称.
代码是这样的.
import tkinter as tk
from tkinter import ttk
my_list = ["Test 1", "Test 2", "Test 3"]
# Set up all the components of the UI.
root = tk.Tk()
root.title('Radio Buttons Test')
root.geometry("1024x768")
# Create counters for use in placing radio buttons.
# Generic counter for labels or wherever it might be useful.
def counter(listfile):
i = 0
for i in range(len(listfile) * 3 + 1):
if i != 0:
yield i
i +=1
count = counter(my_list)
#Counter for rows with even numbers.
def even_counter(listfile):
for i in range(len(listfile) * 2 + 1):
if i != 0 and i % 2 == 0:
yield i
even = even_counter(my_list)
#Counter for rows with odd numbers.
def odd_counter(listfile):
odd_numbers = []
for i in range(len(listfile) * 3 + 1):
if i > 2 and i % 2 != 0:
odd_numbers.append(i)
odd_lst = odd_numbers * 4
odd_lst.sort()
for x in odd_lst:
yield x
odd = odd_counter(my_list)
# Generating numbers to be used in radiobutton's variable naming.
def var_values(listfile):
var_numbers = []
for i in range(len(listfile) * 3 + 1):
var_numbers.append(i)
var_lst = var_numbers * 3
var_lst.sort()
for x in var_lst:
yield x
rb_var_values = var_values(my_list)
def labels(listfile):
for i in listfile:
label_text = tk.Label(root, text=str(next(count))+ '. ' + i, font=("Arial", 11))
label_text.grid(column=0, row=next(even), sticky="w", columnspan=3)
# Generate radio buttons.
rblst = []
var_value = 0
def radio_buttons(listfile):
global var
for rb in range(len(listfile)):
var = tk.IntVar(None)
var_value = next(rb_var_values)
var.set(var_value)
rb1 = ttk.Radiobutton(root, text="Good", variable=var, value=1)
rb2 = ttk.Radiobutton(root, text="Normal", variable=var, value=2)
rb3 = ttk.Radiobutton(root, text="Bad", variable=var, value=3)
rblst.extend([rb1,rb2,rb3])
comment = tk.Entry(root, width=60, borderwidth=3)
rb1.grid(column=0, row=next(odd))
rb2.grid(column=1, row=next(odd))
rb3.grid(column=2, row=next(odd))
comment.grid(column=3, row=next(odd), pady=5)
# Function for the command of "Stats" button.
def stat_btn():
for i in rblst:
print(f'ID is: {id(i)} and Variable is {var.get()}')
print('Length is',len(rblst))
# Create and place the "Stats" button.
bt = tk.Button(root, text="Stats", command=stat_btn)
bt.grid(column=5,row=47, sticky="se")
labels(my_list)
var_values(my_list)
radio_buttons(my_list)
root.mainloop()
通过按Stats按钮,我得到了错误的结果,这意味着只有最后一组单选按钮影响var.get的结果,而不是第一组和第二组.您认为是变量还是单选按钮的值导致了这个问题?上述代码的OOP实现会让事情更容易管理吗?