首页 > 解决方案 > Python - Tkinter:如何在循环中创建单选按钮?

问题描述

您好,我正在尝试为每个问题创建一个包含 5 个选项的问卷。由于我有很多问题,我想在循环中创建标签和单选按钮。但是,我不能在循环中调用 tkinter 的 mainloop() 函数,因此当我在循环外部调用它时,我在任何问题的问卷上的选择都会成为最后一个问题的答案。我怎样才能解决这个问题?

def selected(value, question):
    answer_values[question-1] = value
    print(value, question)
        
root = Tk()
root.title('Kişilik Analiz Testi')

answers = {}

for x in range(0, enneagram.shape[0]):
    soru = str(x+1) + ". " + enneagram.SORULAR[x] + " Cümlesi sizi ne kadar iyi ifade ediyor?"
    
    myLabel = Label(root, text = soru).grid(row = x+1, column = 1, sticky = W)
    Label(root, text = "Sorular").grid(row = 0, column = 1, sticky = W)
    Label(root, text = "Çok Zayıf  ").grid(row = 0, column = 2)
    Label(root, text = "Zayıf      ").grid(row = 0, column = 3)
    Label(root, text = "Orta       ").grid(row = 0, column = 4)
    Label(root, text = " İyi       ").grid(row = 0, column = 5)
    Label(root, text = "Çok İyi").grid(row = 0, column = 6)
    
    answers["soru{0}".format(x)] = IntVar()
    answers["soru{0}".format(x)].set(3)
    
   
    button = Radiobutton(root, variable = answers["soru{0}".format(x)], value = 1, command = lambda: selected(1, x+1)).grid(row = x+1, column = 2)
    button = Radiobutton(root, variable = answers["soru{0}".format(x)], value = 2, command = lambda: selected(2, x+1)).grid(row = x+1, column = 3)
    button = Radiobutton(root, variable = answers["soru{0}".format(x)], value = 3, command = lambda: selected(3, x+1)).grid(row = x+1, column = 4)
    button = Radiobutton(root, variable = answers["soru{0}".format(x)], value = 4, command = lambda: selected(4, x+1)).grid(row = x+1, column = 5)
    button = Radiobutton(root, variable = answers["soru{0}".format(x)], value = 5, command = lambda: selected(5, x+1)).grid(row = x+1, column = 6)

root.mainloop()

当我运行这个单元格时,我得到了这个窗口。默认选择是中间的。当我单击其他选项时,它会打印出最后一个问题的索引:

标签: pythontkinter

解决方案


试试这个代码:

import tkinter as tk
from functools import partial


def function(i):
    print("You toggled number %i"%i)
    print([var.get() for var in variables])


root = tk.Tk()
variables = []

for i in range(5):
    # Create the new variable
    variable = tk.IntVar()
    variables.append(variable)

    # Create the command using partial
    command = partial(function, i)

    # Create the radio button
    button = tk.Radiobutton(root, variable=variable, value=i, command=command)
    button.pack()

root.mainloop() 

它使用partial来自functools.


推荐阅读