【问题标题】:Python - Tkinter: How can I create multiple radiobuttons?Python - Tkinter:如何创建多个单选按钮?
【发布时间】:2017-04-20 20:33:49
【问题描述】:

又是我。 :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()

【问题讨论】:

    标签: python tkinter radiobuttonlist


    【解决方案1】:

    您只需为每个 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()
    

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

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


    我也摆脱了那个“明星”进口。当然,很多 Tkinter 示例使用“星号”导入,但不建议这样做:它会在 Python 2 中使用超过 170 个名称(在 Python 3 中大约有 130 个名称)污染您的命名空间,这很混乱并且可能导致名称冲突。虽然在import Tkinter as tk 时需要输入更多内容,但它使代码更易于阅读,因为很明显哪些名称是 Tkinter 名称。

    【讨论】:

    • 是的,它有效,谢谢。 :) Ps.:如果我再次发布代码,我会注意到这一点!我是新手,还没有体验过。
    • 忘记了——抱歉。 ^^
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多