我在这里的第一个问题.切中要害.我想用包含多组单选按钮的tkinter实现一个界面.每组将有三个单选按钮(好、正常、差).在代码执行后,用户将 Select 他想要的单选按钮,最后他按下一个按钮来收集所有单选按钮的值,这样我们就可以有一个统计视图,假设 Select 了多少个单选按钮.以上所有内容都应该尽可能动态地实现.

我试过的东西. 我使用发电机进行以下操作:

  1. 一排排标签.
  2. 一排排单选按钮.
  3. 变量=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实现会让事情更容易管理吗?

推荐答案

你可以像这样实现,你可以复制这段代码,我希望这能起作用.

import tkinter as tk
from tkinter import ttk

my_list = ["Test 1", "Test 2", "Test 3"]

root = tk.Tk()
root.title('Radio Buttons Test')
root.geometry("1024x768")

def counter(listfile):
    i = 0
    for i in range(len(listfile) * 3 + 1):
        if i != 0:
            yield i
            i +=1

count = counter(my_list)

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)

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)

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)

rblst = []
var_values_list = []  # List to hold the var variables for each group

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)
        var_values_list.append(var)  # Store the var variable for each group

def stat_btn():
    for i, var in enumerate(var_values_list):
        print(f'ID is: {id(rblst[i])} and Variable is {var.get()}')
    print('Length is', len(rblst))

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()

Python相关问答推荐

如何用symy更新分段函数

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

如何计算列表列行之间的公共元素

从webhook中的短代码(而不是电话号码)接收Twilio消息

如何根据参数推断对象的返回类型?

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

Julia CSV for Python中的等效性Pandas index_col参数

基于字符串匹配条件合并两个帧

如何在Python脚本中附加一个Google tab(已经打开)

将tdqm与cx.Oracle查询集成

ThreadPoolExecutor和单个线程的超时

Pandas DataFrame中行之间的差异

在ubuntu上安装dlib时出错

旋转多边形而不改变内部空间关系

基于形状而非距离的两个numpy数组相似性

Python 3试图访问在线程调用中实例化的类的对象

Python将一个列值分割成多个列,并保持其余列相同

如何设置nan值为numpy数组多条件

设置索引值每隔17行左右更改的索引

在聚合中使用python-polars时如何计算模式