2017-06-01 79 views
0

我一直在尝试使用*kwargs来制作Radiobutton的选择菜单。 不幸的是,发送的变量顺序并不保持:Easy,Medium,Hard,Extreme。而且,即使我确实将v设置为特定值,所有选项都会一次选择。自动选择Radiobutton tkinter

我在这里错过了什么吗?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import Tkinter as tk 
from Tkinter import * 


class MainApplication(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 

    def onClick(self, event): 
     print("Clicked") 

    def qChoice(self, **kwargs): 
     v = IntVar() 
     v.set(1) 
     for key, value in kwargs.iteritems(): 
      self.Rbutton = Radiobutton(text=key, variable=v, value=value) 
      self.Rbutton.grid(sticky=W) 

    def basics(self): 
     self.label = Label(text="Enter name:") 
     self.label.grid(column=0, row=0, sticky="E") 
     self.entry = Entry() 
     self.entry.grid(column=1, row=0) 
     self.button = Button(text="Enter") 
     self.button.bind("<Button-1>", self.onClick) 
     self.button.grid(column=3, row=0) 
     self.qChoice(Easy=1,Medium=2,Hard=3,Extreme=4) 

if __name__ == "__main__": 
    root = tk.Tk() 
    App = MainApplication(root) 
    App.basics() 
    root.mainloop() 

回答

1

您正在使用v的局部变量,该函数在退出函数时收集垃圾。你需要保持一个永久参考:

def qChoice(self, **kwargs): 
    self.v = Intvar() 
    ... 

在一个侧面说明,你不需要两个import语句。使用其中一种,但不能同时使用。理想情况下,使用第一个:

import Tkinter as tk 
+0

太感谢你了,我甚至没有看到这样的说法。 你知道为什么* kwargs没有被正确迭代吗? – Prixeler

1

您的IntVar()是本地和垃圾。

def qChoice(self, **kwargs): 
    # changed to self.v from v 
    self.v = IntVar() 
    # .set(None) leaves all the self.v instances blank 
    # if you did .set('1'), the first one will be auto-selected 
    # you can also remove this line if you want them to start blank 
    self.v.set(None) 
    for key, value in kwargs.iteritems(): 
     self.Rbutton = Radiobutton(text=key, variable=self.v, value=value) 
     self.Rbutton.grid(sticky=W) 

类似的主题为你:

Reference 1

Reference 2