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 名称。
又是我。 :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 名称。