![](/img/trans.png)
[英]Python Tkinter - Can radio button values be floating point numbers?
[英]Radio button values in Python Tkinter
我正在嘗試使用Tkinter在Python中創建一個對話框。 目的是創建一個帶有兩個單選按鈕和一個“確定”按鈕的對話框。 單選按鈕一選擇“默認”選項。 單選按鈕2選擇選項“用戶定義”。 “確定”按鈕關閉窗口。
問題1:如何通過單選按鈕保存值? 也就是說,如何將選定的單選按鈕傳遞給腳本的其余部分?
問題2:如何使第二個單選按鈕包含用戶文本輸入(沿着tkSimpleDialog.askstring行)? 我希望該按鈕顯示一個單選按鈕,一個提示(“輸入值:”)和一個供用戶輸入文本的空間-所有這些都作為一個單選按鈕選項在一行上全部顯示。
因此,整個對話框的頂部單選按鈕應為普通單選按鈕,第二個按鈕指定用戶輸入並包括用於該用戶輸入的空間(以及OK按鈕)。
到目前為止,我打開了一個帶有兩個選項的對話框,但是該值沒有傳遞給我可以看到的任何內容; 即使我選擇單選按鈕,選擇也會返回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...
聚會晚了一點,但是我在嘗試在Tkinter單選按鈕上找到東西時偶然發現了這個問題。
我改變了三件事:
1)定義完后,我立即將var
的值設置為1
。 這是通過執行var.set(1)
來完成的,並確保選擇了第一個單選按鈕(其值為1,如稍后在代碼中定義的那樣)。
2)我已經用一個名為quit_loop
的函數替換了master.quit
命令。 在此功能中:
var
值通過print
和get
語句print
。 get
將“獲取” var
的當前值,這取決於選擇了哪個單選按鈕。 get
var
的當前值。 master.quit()
添加了括號,因為它不再位於單選按鈕的命令中。 請注意,如果您打算使用IDLE, master.destroy()
可能是更合適的選擇 。 3)由於在函數中創建了selection
變量,我們現在將所需的值存儲在變量中。 在代碼末尾有一個最后的if
-statement來表明它正在工作。
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
(因此為文本變量),因此僅對整數進行檢查由您決定。
3)當然,這沒有鏈接到第二個單選按鈕。 如果我們選擇它,它的值仍然是2,而不是Entry
小部件的值。 這就是為什么在先前創建的quit_loop
函數中,添加了一個小的if
語句, if
selection
了第二個單選按鈕,則該語句將條目的值分配給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仍然很小,則可以用這種方式編寫代碼。 但是,在此基礎上進一步擴展,我建議您采用面向對象的方法,因為它確實可以大大提高可讀性,尤其是在定義函數時。 這樣就不必事先定義它們。
而不是直接在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()
。
按照設置,將在窗口出現之前設置選擇值( 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.