簡體   English   中英

Python Tkinter中的單選按鈕值

[英]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:

我改變了三件事:

1)定義完后,我立即將var的值設置為1 這是通過執行var.set(1)來完成的,並確保選擇了第一個單選按鈕(其值為1,如稍后在代碼中定義的那樣)。

2)我已經用一個名為quit_loop的函數替換了master.quit命令。 在此功能中:

  • var值通過printget語句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."

問題2:

我會保持簡單,僅在您的單選按鈕之后添加一個標簽和一個輸入框。 這意味着我們還必須使用列,因為您在先前的代碼中沒有定義任何列,這使所有內容默認為列0。我們希望您的第二個單選按鈕為“ radio,label,entry”,該列需要三列。

1)先前包含"Select OCR language"標簽將跨越三列, columnspan=3添加到網格參數中。 第一個單選按鈕也是如此。

2)我在第二個單選按鈕之后添加了LabelEntry 請注意,列從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM