2017-06-01 77 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