Python - Tkinter:如何创建多个单选按钮?

Python - Tkinter: How can I create multiple radiobuttons?

又是我。 :p 我在一个组中定义了 RadioButtons 以减少我的代码。但是我怎么能以这种方式创建多个单选按钮呢?例如,我想创建两个列表,但在两个列表中我只想选择一个。 这是我的代码:

from Tkinter import *

master = Tk()
var = IntVar()
var.set(1)#Wahl inizialisieren
scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

master.geometry('1000x500') #Abmessung Fenster
master.title('test') #Tittel Fenster


def create_window(): #Definion und Festlegung neues Fenster
    toplevel = Toplevel()
    toplevel.title('result')
    toplevel.geometry('1500x1000')
    toplevel.focus_set()

   sex = [
    ("male",1),
    ("female",2),
    ("male1",3),
    ("female1",4),
]

test = [
    ("test",5),
    ("test1",6),
    ("test2",7),
    ("test3",8),
]

def ShowChoice():
    print var.get()

#Erzeugung
Checkliste----------------------------------------------------------------

Label(master,
      text='''choose one answer:''',
      padx = 20).pack()

for txt, val in sex:
    Radiobutton(master,
                text=txt,
                justify = LEFT,
                padx = 20,
                variable=var,
                variable=v,
                command=ShowChoice,
                value=val).pack(anchor=N)

Label(master,
      text='''choose one answer:''',
      padx = 20).pack()

for txt, val in test:
    Radiobutton(master,
                text=txt,
                justify = LEFT,
                padx = 20,
                variable=var,
                variable=v1,
                command=ShowChoice,
                value=val).pack(anchor=N)



#-------------------------------------------------------------------------

Button(master, text='forward', command=create_window).pack(padx=5, 
anchor=N, pady=4)


master.mainloop()

您只需为每个 Radiobutton 组分配自己的 variable。但是 ShowChoice 怎么知道 variable 调用 .get() 呢?好吧,一种处理方法是使 command 回调函数成为一个将 variable 作为默认参数的 lambda。在我们这样做的同时,我们也可以将 txt 作为默认参数传递。

from __future__ import print_function
import Tkinter as tk

master = tk.Tk()

sex = [
    ("male", 1),
    ("female", 2),
    ("male1", 3),
    ("female1", 4),
]

test = [
    ("test", 5),
    ("test1", 6),
    ("test2", 7),
    ("test3", 8),
]

def ShowChoice(text, v):
    print(text, v.get())

varsex = tk.IntVar()
varsex.set(sex[0][1])

tk.Label(master, text='Choose one answer:').pack()

for txt, val in sex:
    tk.Radiobutton(master, text=txt, variable=varsex, value=val,
        command=lambda t=txt, v=varsex: ShowChoice(t, v)).pack(anchor=tk.N)

vartest = tk.IntVar()
vartest.set(test[0][1])

tk.Label(master, text='Choose one answer:').pack()

for txt, val in test:
    tk.Radiobutton(master, text=txt, variable=vartest, value=val,
        command=lambda t=txt, v=vartest: ShowChoice(t, v)).pack(anchor=tk.N)

master.mainloop()

我已经删除了您程序中与您的问题无关的各种内容。 post 一个专注于实际程序的 MCVE 是个好主意,而不是用不相关的东西使你的问题代码膨胀。

我已将您的 print 语句转换为 print 函数调用,以便更轻松地 运行 您在 Python 上的程序 3,所有您需要做的是在 import 语句中将 Tkinter 更改为 tkinter


我也去掉了 "star" 导入。当然,很多 Tkinter 示例使用 "star" 导入,但不推荐这样做:它会在 Python 2 中使用超过 170 个名称(以及 Python 3 中大约 130 个名称)污染您的命名空间,这是凌乱并可能导致名称冲突。尽管在执行 import Tkinter as tk 时需要输入更多内容,但它使代码更易于阅读,因为很明显哪些名称是 Tkinter 名称。