热门标签:
Q:

Python Tkinter中的单选按钮值

我正在尝试使用Tkinter在Python中创建一个对话框。 目标是有一个带有两个单选按钮和一个"确定"按钮的对话框。 单选按钮一选择选项"默认"。 单选按钮二选择选项"用户定义。""确定"按钮关闭窗口。

问题1:如何保存单选按钮中的值? 也就是说,如何将选定的单选按钮传递给我的脚本的其余部分?

问题2:我怎样才能让第二个单选按钮包括用户文本输入(沿着tkSimpleDialog的线条。askstring)? 我希望该按钮显示一个radiobutton,一个提示符("输入值:")和一个用户输入文本的空格-所有这些都在一行中作为单个radiobutton选项。
因此,整个对话框的顶部单选按钮应该是一个普通的单选按钮,第二个按钮指定用户输入并包含该用户输入的空格(和OK按钮)。

到目前为止,我有一个有两个选项的对话框打开,但该值不会传递给我能看到的任何东西;即使在我选择radiobutton之前,selection也会返回为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...
原网址
A:

聚会有点晚了,但我在试图在Tkinter radiobuttons上找到一些东西时偶然发现了这个问题。

问题1:

我改变了三件事:

1)我在定义后立即将var的值设置为1。 这是通过执行var.set(1)来完成的,并将确保您的第一个单选按钮被选中(它的值为1,正如您稍后在代码中定义的那样)。

2)我已经用一个名为quit_loop的函数替换了你的quit_loop命令。 在这个函数中:

  • var值通过printget语句打印。 get将'获取'var的当前值,这取决于选择了哪个单选按钮。
  • 我在此函数中创建一个全局变量,然后它将getvar的当前值。
  • 我在master.quit()因为这不再在单选按钮的命令中。 请注意,如果您计划使用IDLE,master.destroy()可能是更合适的替代方案

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."

问题2:

我会保持简单,只需在单选按钮后添加一个标签和一个输入框。 这意味着我们还必须处理列,因为您在以前的代码中没有定义任何列,这使得所有内容都默认为列0。 我们希望您的第二个单选按钮是"radio,label,entry",需要三列。

1)前一个包含"Select OCR language"的标签将跨越三列,并将columnspan=3添加到网格参数中。 你的第一个单选按钮也是如此。

2)我在你的第二个单选按钮后面添加了aLabel和anEntry。 请注意,列从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仍然很小,那么以这种方式编写代码是可以的。 但是,进一步扩展了很多,我建议采用面向对象的方法,因为它确实大大提高了可读性,特别是在定义函数时。 这样,它们就不必事先定义。

所有回答

共 2 条

author avatar

不要直接在按钮的命令中使用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()

author avatar

作为设置,选择值将在窗口出现(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()

相似问题