Python Forum
[Tkinter] Selected radio button in push button in Tkinter - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] Selected radio button in push button in Tkinter (/thread-3659.html)



Selected radio button in push button in Tkinter - prashantfunde91 - Jun-11-2017

my question here

my code here
Hello everyone i am learning about Python GUI stuff,

I have to use 4 radio buttons and a push button.
I created following code for the same.
import Tkinter as tk
from Tkinter import *
import ttk

root = tk.Tk()
root.title("GUI")
root.geometry("300x200")


#####################___________ Profile-1 ___________#####################    
def Profile_1():
   print('Profile 1 selected')

#####################___________ Profile-2 ___________#####################  
def Profile_2():
   print('Profile 2 selected')

#####################___________ Profile-3 ___________#####################  
def Profile_3():
   print('Profile 3 selected')
#####################___________ Profile-4 ___________#####################          
def Profile_4():
   print('profile 4 selected')


def serial_port():
   global var
   print('It comes in to push button menu')
   x = Profile_sel_1.selection_get()
   print(x)
   
var = IntVar()
#Button to show selected profile to assign FTW
Profile_sel_1=Radiobutton(root, text='Profile Selection_1',variable =var, value =1,command = Profile_1,width = 20)
Profile_sel_2=Radiobutton(root, text='Profile Selection_2',variable =var, value =2,command = Profile_2,width = 20)
Profile_sel_3=Radiobutton(root, text='Profile Selection_3',variable =var, value =3,command = Profile_3,width = 20)
Profile_sel_4=Radiobutton(root, text='Profile Selection_4',variable =var, value =4,command = Profile_4,width = 20)
#Button to show entered reg values and data in it
ser_port_btn=Button(root, text='ENTER',command = serial_port,relief="flat",background="#ccc",width=20)
Profile_sel_1.grid(row=1,column = 5)
Profile_sel_2.grid(row=2,column = 5)
Profile_sel_3.grid(row=3,column = 5)
Profile_sel_4.grid(row=4,column = 5)
ser_port_btn.grid(row = 7, column = 3)

root.mainloop()
But When Profile_sel_1 is active high that time function inside it should be used after pressing push button.


RE: Selected radio button in push button in Tkinter - DeaD_EyE - Jun-22-2017

Hm, still no answer...
If I understood it right, you want to do an action after you've pressed the button. In this case you just remove command in Radiobutton. Use instead inside the function var.get() to get the current selection. To put everything in functions is better. The use of global is not good. Instead you can prepare a function call with lambda or partial from functools. Here your changed code.

# boiler plate code for python2/3 compatibility
# i don't like to run python2.7
from __future__ import print_function
from functools import partial
try:
    import Tkinter as tk
    from Tkinter import *
    import ttk
except ModuleNotFoundError:
    import tkinter as tk
    from tkinter import *  
    from tkinter import ttk
# you don't need it


def serial_port(var):
    selection = var.get()
    # get the value out of var, which has been defined in main()
    print('Pushed the button!')
    print('var has value', selection)
    # to save space
    text_dict = {
        0: 'Nothing selected!', 
        1: 'Profile 1 selected',
        2: 'Profile 2 selected',
        3: 'Profile 3 selected',
        4: 'profile 4 selected'
        }
    # you can also put functions as a value to the text_dict
    # and call them after you got the value
    # d = {1: function}
    # d[1]('do_something')
    # just as a hint
    text_to_print = text_dict[selection]
    print(text_to_print)


def main():
    root = tk.Tk()
    root.title("GUI")
    root.geometry("300x200")    
    var = IntVar()
    #Button to show selected profile to assign FTW
    profile_sel_1=Radiobutton(root, text='Profile Selection_1', variable=var, value=1, width=20)
    # just removed command
    # you can preselect a Radiobutton with:
    # profile_sel_1.select()
    # or you can use the variable var, to select the Radiobutton
    # var.set(1)
    profile_sel_2=Radiobutton(root, text='Profile Selection_2', variable=var, value=2, width=20)
    profile_sel_3=Radiobutton(root, text='Profile Selection_3', variable=var, value=3, width=20)
    profile_sel_4=Radiobutton(root, text='Profile Selection_4', variable=var, value=4, width=20)
    # Button to show entered reg values and data in it
    ser_port_btn=Button(root, text='ENTER', command=partial(serial_port, var), relief="flat", background="#ccc", width=20)
    # or use (..., command=lambda: serial_port(var), ...)
    profile_sel_1.grid(row=1, column=5)
    profile_sel_2.grid(row=2, column=5)
    profile_sel_3.grid(row=3, column=5)
    profile_sel_4.grid(row=4, column=5)
    ser_port_btn.grid(row=7, column=3)
    root.mainloop()


if __name__ == '__main__':
    main()
Later you want to use classes for it. It makes your code more modular and you can save the state inside the class.