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

时间:2017-04-20 11:27:31

标签: python tkinter radiobuttonlist

我再次。 :p 我已在组中定义RadioButtons以减少我的代码。但是我怎么能用这种方式创建多个radioButton?例如,我想创建两个列表,但在两者中我只想选择一个选项。 这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

您只需要为每个Radiobutton组提供自己的variable。但是ShowChoice如何知道要variable调用.get()的内容?好吧,处理它的一种方法是使command回调函数成为一个lambda,其variable作为默认参数。虽然我们这样做,但我们也可以将txt作为默认arg传递。

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

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

我已将您的print语句转换为print函数调用,以便更轻松地在Python 3上运行您的程序,您只需将Tkinter更改为{{ 1 {}在tkinter语句中。

我也摆脱了那个“明星”的导入。当然,很多Tkinter示例使用“star”导入,但不推荐使用:它在Python 2中使用超过170个名称(以及Python 3中的大约130个名称)污染您的名称空间,这很混乱并且可能导致名称冲突。虽然在执行import时会有更多的输入,但它使代码更容易阅读,因为很明显哪些名称是Tkinter名称。