我正在尝试使用Tkinter在Python中创建一个对话框。目标是有一个带有两个单选按钮和一个“确定”按钮的对话框。单选按钮1选择“默认”选项。单选按钮2选择“用户定义”选项。 “确定”按钮关闭窗口。
问题1:如何从单选按钮保存值?也就是说,如何将选定的单选按钮传递给我的其余脚本?
问题2:如何让第二个单选按钮包含用户文本输入(沿着tkSimpleDialog.askstring的行)?我希望该按钮显示一个单选按钮,一个提示符(“输入值:”),以及一个供用户输入文本的空间 - 所有这些按钮作为单个单选按钮选项。 因此整个对话框应该将顶部单选按钮设置为普通单选按钮,第二个按钮指定用户输入并包含该用户输入的空间(以及“确定”按钮)。
到目前为止,我打开了一个包含两个选项的对话框,但是这个值没有传递给我能看到的任何内容;即使在选择单选按钮之前,选择也会返回为0 非常感谢您对这两个问题的任何帮助,谢谢 到目前为止,这是我的脚本:
from Tkinter import*
master = Tk()
var = IntVar()
Label(master, text = "Select OCR language").grid(row=0, sticky=W)
Radiobutton(master, text = "default", variable = var, value = 1).grid(row=1, sticky=W)
Radiobutton(master, text = "user-defined", variable = var, value = 2).grid(row=2, sticky=W)
Button(master, text = "OK", command = master.quit).grid(row=3, sticky=W)
selection = var.get()
print "Selection:", selection
mainloop()
#If selection == 0 do one thing
#If selection == 1 do something else...
答案 0 :(得分:6)
派对有点晚了,但我在试图在Tkinter radiobuttons上找到一些东西时偶然发现了这个问题。
我改变了三件事:
1)在您定义之后,我立即将var
的值设置为1
。这是通过执行var.set(1)
来完成的,并确保选择了第一个单选按钮(其值为1,正如您稍后在代码中定义的那样)。
2)我已使用名为master.quit
的函数替换了quit_loop
命令。在这个功能中:
var
值通过print
和get
语句打印。 get
将“获取”var
的当前值,具体取决于所选的单选按钮。get
var
的当前值。master.quit()
添加了括号,因为这不再是单选按钮的命令。请注意,如果您打算使用IDLE,master.destroy()
可能是a more suitable alternative。 3)由于在函数中创建了selection
变量,我们现在将您想要的值存储在变量中。在代码末尾有一个最终if
- 语句,表明它正在运行。
from Tkinter import *
master = Tk()
var = IntVar()
var.set(1)
def quit_loop():
print "Selection:",var.get()
global selection
selection = var.get()
master.quit()
Label(master, text = "Select OCR language").grid(row=0, sticky=W)
Radiobutton(master, text = "default", variable=var, value = 1).grid(row=1, sticky=W)
Radiobutton(master, text = "user-defined", variable=var, value = 2).grid(row=2, sticky=W)
Button(master, text = "OK", command=quit_loop).grid(row=3, sticky=W)
master.mainloop()
if selection == 1:
print "My Value is equal to one."
elif selection == 2:
print "My value is equal to two."
我会保持简单,只需在你的单选按钮后添加一个标签和一个输入框。这意味着我们还必须处理列,因为您之前的代码中没有任何定义,这使得所有内容都默认为第0列。我们希望您的第二个单选按钮是“radio,label,entry”,它需要三列
1)包含"Select OCR language"
的上一个标签将跨越三列,并在网格参数中添加columnspan=3
。第一个单选按钮也是如此。
2)我在第二个单选按钮后添加了Label
和Entry
。请注意,列从0到2,定义了我们的三列。标签有一个简单的"Enter value:"
文本,而条目有变量textvariable=entry_text
。我将此变量entry_text
添加到代码的开头,并立即将其值设置为###
。请注意,这是string
(因此, text 变量),因此仅添加对整数的检查取决于您。
3)当然,这与第二个单选按钮无关。如果我们选择它,它仍然具有值2,而不是Entry
小部件的值。这就是为什么在先前创建的quit_loop
函数中,我添加了一个小if
语句,如果选择了第二个单选按钮,则会将条目的值分配给selection
。
from Tkinter import *
master = Tk()
var = IntVar()
var.set(1)
entry_text = StringVar()
entry_text.set("###")
def quit_loop():
print "Selection:",var.get()
global selection
selection = var.get()
if selection == 2:
selection = entry_text.get()
master.quit()
# Add columnspan to these widgets
Label(master, text = "Select OCR language").grid(row=0, sticky=W, columnspan=3)
Radiobutton(master, text = "default", variable=var, value = 1).grid(row=1, sticky=W, columnspan=3)
# Order these widgets in their appropriate columns
Radiobutton(master, variable=var, value = 2).grid(row=2, sticky=W, column=0)
Label(master, text="Enter value:").grid(row=2, sticky=W, column=1)
Entry(master, textvariable=entry_text).grid(row=2, sticky=W, column=2)
# Example of what happens without columnspan
Button(master, text = "OK", command=quit_loop).grid(row=3, sticky=W)
master.mainloop()
print selection
如果这个简单的GUI仍然很小,那么以这种方式编写代码是可以的。但是,在这方面进一步扩展我会建议使用an object oriented approach,因为它确实提高了可读性,特别是在定义函数时。这样他们就不必事先定义。
答案 1 :(得分:0)
不是直接在Button命令中使用master.quit
,而是定义一个完成程序然后调用master.quit()
的函数:
def end_program(event=None):#event will let it be used as .bind callbacks too if you need it.
selection = var.get()
if selection:
NotImplemented
else:
NotImplemented
master.quit()
...
Button(master, text = "OK", command = end_program).grid(row=3, sticky=W)
关闭一个主服务器清理一些来自小部件的数据,因此只有在完成访问小部件后才需要调用master.quit()
。
答案 2 :(得分:0)
设置选择值将在窗口出现之前设置(selection = 0
)。
如果您想在mainloop()
之后运行测试,selection = var.get()
也应该在mainloop()
之后进行测试。
如果您不想在测试前关闭主窗口,请使用command=function
:
from Tkinter import *
def function():
selection = var.get()
if selection == 1:
# Default
elif selection == 2:
# User-defined
else:#selection==0
#No choice
master.quit()
master = Tk()
var = IntVar()
Label(master, text = "Select OCR language").grid(row=0, sticky=W)
Radiobutton(master, text = "default", variable = var, value = 1).grid(row=1, sticky=W)
Radiobutton(master, text = "user-defined", variable = var, value = 2).grid(row=2, sticky=W)
Button(master, text = "OK", command = function).grid(row=3, sticky=W)
mainloop()