Python Tkinter中的单选按钮值

Bir*_*ird 2 python tkinter radio-button

我正在尝试使用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...
Run Code Online (Sandbox Code Playgroud)

Jiy*_*sei 6

派对有点晚了,但我在尝试在Tkinter radiobuttons上找到一些东西时偶然发现了这个问题.

问题1:

我改变了三件事:

1)我在你定义之后立即设置了varto 的值1.这样做var.set(1)可以确保您的第一个单选按钮被选中(其值为1,正如您稍后在代码中定义的那样).

2)我master.quit用一个名为的函数替换了你的命令quit_loop.在这个功能:

  • var值通过printget声明打印.该get会"得到"的当前值var,这取决于哪个单选按钮被选中的.
  • 我在这个函数中创建了一个全局变量,然后get是当前的值var.
  • 我添加了括号,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."
Run Code Online (Sandbox Code Playgroud)

问题2:

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

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

2)我在第二个单选按钮后添加了一个Label和一个Entry.请注意,列从0到2,定义了我们的三列.标签有一个简单的"Enter value:"文本,而条目有变量textvariable=entry_text.我将此变量添加entry_text到代码的开头并立即将其值设置为###.请注意,这是一个string(因此,文本变量),因此只添加对整数的检查取决于您.

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
Run Code Online (Sandbox Code Playgroud)

小费

如果这个简单的GUI仍然很小,那么以这种方式编写代码是可以的.然而,在这方面进一步扩展我会建议采用面向对象的方法,因为它确实提高了可读性,特别是在定义函数时.这样他们就不必事先定义.