Radio button values in Python Tkinter

后端 未结 3 1664
陌清茗
陌清茗 2021-01-14 18:10

I am trying to create a dialog box in Python using Tkinter. The goal is to have a dialog box with two radio buttons and an \"OK\" button. Radio button one selects the opti

相关标签:
3条回答
  • 2021-01-14 18:43

    Instead of directly using master.quit in the Button's command, define a function that finishes up the program then calls 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)
    

    one the master is closed some of the data from the widgets is cleaned up so master.quit() needs to be called only after you are done accessing the widgets.

    0 讨论(0)
  • 2021-01-14 18:49

    A bit late to the party, but I stumbled upon this question while trying to find something on Tkinter radiobuttons.

    Question 1:

    I changed three things:

    1) I immediately set the value of var to 1 after you've defined it. This is done by doing var.set(1) and will make sure your first radio button is selected (which has a value of 1, as you defined it later on in the code).

    2) I've replaced your master.quit command with a function called quit_loop. In this function:

    • The var value is printed through a print and get statement. The get will 'get' the current value of var, which depends on which radio button is selected.
    • I create a global variable within this function, which will then get the current value of var.
    • I added parentheses to master.quit() because this is no longer in the command of a radio button. Note that if you plan on using IDLE, master.destroy() might be a more suitable alternative.

    3) Due to the creation of the selection variable in the function we now have your wanted value stored in a variable. There is one final if-statement at the end of the code to show it's working.

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

    Question 2:

    I would keep it simple and just add a label and an entry box right after your radio button. This means that we also have to work with columns as you didn't have any defined in your previous code, which makes everything default to column 0. We want your second radio button to be 'radio, label, entry' which takes three columns.

    1) The previous label containing "Select OCR language" will be spanned over three columns with columnspan=3 added to the grid arguments. The same goes for your first radio button.

    2) I added a Label and an Entry after your second radio button. Note that the columns go from 0 to 2, defining our three columns. The label has a simple "Enter value:" text, whereas the entry has the variable textvariable=entry_text. I added this variable entry_text to the beginning of your code and immediately set its value to ###. Note that this is a string (hence, textvariable) so adding checks for integer numbers only is up to you.

    3) Of course, this is not linked to the second radio button. It still has a value of 2 if we select it, not the value of the Entry widget. That's why, in the previously created quit_loop function, I added a small if statement that assigns the value of the entry to selection if the second radio button was selected.

    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
    

    Tip

    If this simple GUI remains this small, it's ok to write code in this manner. However, expanding a lot on this further I would suggest taking an object oriented approach as it really improves readability a lot, especially when functions are being defined. That way they don't have to be necessarily defined beforehand.

    0 讨论(0)
  • 2021-01-14 18:54

    As set the selection value will be set before the window appears (selection = 0).

    If you want to run tests after mainloop(), selection = var.get() should also be after mainloop() with tests.

    If you do not want to close the master window before tests, use 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()
    
    0 讨论(0)
提交回复
热议问题