Место, где вы храните переменный объект (в вашем случае StringVar, v), должно сохраняться, чтобы это странное поведение не проявилось. Я предполагаю, что мы наблюдаем это поведение, потому что v выходит из области видимости, что-то идет не так. Помимо использования global, я не могу придумать способ сделать это из функции.
Сломанный код:
from Tkinter import *
def App(master):
v = StringVar()
v.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=v, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
App(master)
mainloop()
Пример исправления:
from Tkinter import *
def App(master, radio_var):
radio_var.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=radio_var, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
radio_var = StringVar()
App(master, radio_var)
mainloop()
Учтите, что если вам нужно сохранить несколько переменных, вы можете передать список или словарь переменных.
Кроме того, на случай, если «должен быть в функции» - это требование к домашнему заданию, подумайте об упаковке кода в классе. Я не эксперт по тк, но, похоже, это предпочтительный способ организации вашего кода.
Пример исправления 2:
from Tkinter import *
class App(object):
def __init__(self, master):
self.radio_var = StringVar()
self.radio_var.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=self.radio_var, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
app = App(master)
mainloop()
Обратите внимание на незначительное изменение в
app = App(master)
Это необходимо для того, чтобы экземпляр приложения не собирался преждевременно. Это фактически вывело бы self.radio_var из области видимости, и мы вернулись на круги своя.