Python 2.7.2全局变量+ tkinter

时间:2011-10-23 10:49:28

标签: python tkinter global-variables python-2.7

我在使用全局变量时遇到了一些问题:

#Dev by Mkee
import Tkinter as tk
import sys, random
globvar = 0
class Shuffle(object):
    def __init__(self,master=None):
        self.master=master
        self.text=tk.Label(master, text="Type in something:")
        self.box=tk.Entry(master)
        self.buttn = tk.Button(master, text="Done", width=10, command=self.calc())
        self.result = tk.Label(self.master, text=globvar)
    def hide(self):
        self.text.pack_forget()
        self.box.pack_forget()
        self.buttn.pack_forget()
        self.result.pack_forget()
    def show(self):
        self.text.pack(padx=2, pady=2)
        self.box.focus_set()
        self.box.pack(side=tk.TOP, padx=3, pady=3)
        self.buttn.pack(side=tk.TOP, padx=3, pady=3)
        self.result.pack(side=tk.TOP, padx=3, pady=3)
    def calc(self):
        word = self.box.get()
        while len(word) != 0:
            i = random.randrange(0, len(word))
            global globvar
            globvar = word[i] 
            word = word[0:i] + word[i+1:]


class MainApp(object):
    def __init__(self,master=None):
        self.master=master
        app=self.app=tk.Tk()
        app.title("Mkee's Tools")
        app.geometry('500x500')
        menubar=tk.Menu(app)
        self.shuffle=Shuffle(master)
        self.current=self.shuffle
        program_menu=tk.Menu(menubar)
        program_menu.add_command(label='Shuffle',command=self.show_shuffle)
        menubar.add_cascade(label='Programs', menu=program_menu)
        app.config(menu=menubar)
    def show_shuffle(self):
        self.current.hide()
        self.current=self.shuffle
        self.shuffle.show()
    def show_buttons(self):
        self.current.hide()
        self.current=self.buttons        
        self.buttons.show()

def main():
    m=MainApp()
    m.app.mainloop()

if __name__=='__main__':
    main()

单击按钮self.buttn = tk.Button(master, text="Done", width=10, command=self.calc())时出现问题。我想让self.result = tk.Label(self.master, text=globvar)显示从calc中获取的globvar,而是显示在类globvar = 0之前设置的globvar。 我做错了什么?

1 个答案:

答案 0 :(得分:4)

  1. 要进行标签更新,请设置textvariable=self.globvar,其中 self.globvar = tk.StringVar()。通过调用self.globvar.set来更新标签文本。
  2. command=self.calc()更改为command=self.calc(不会 括弧)。使用括号,当时调用self.calc() self.buttn已定义。并且命令被设置为返回值 self.calc()None。按钮没有任何反应 因command等于None而被按下。没有括号, command设置为函数对象self.calc,并且 只要按下按钮,就会调用(正确)函数。
  3. 尽量避免使用全局变量。这将有助于Shuffle自包含,更容易重复使用和导入。

  4. import Tkinter as tk
    import sys, random
    
    class Shuffle(object):
        def __init__(self,master=None):
            self.master=master
            self.text=tk.Label(master, text="Type in something:")
            self.box=tk.Entry(master)
            self.buttn = tk.Button(master, text="Done", width=10, command=self.calc)
            self.globvar = tk.StringVar()
            self.globvar.set(0)
            self.result = tk.Label(self.master, textvariable=self.globvar)
        def hide(self):
            self.text.pack_forget()
            self.box.pack_forget()
            self.buttn.pack_forget()
            self.result.pack_forget()
        def show(self):
            self.text.pack(padx=2, pady=2)
            self.box.focus_set()
            self.box.pack(side=tk.TOP, padx=3, pady=3)
            self.buttn.pack(side=tk.TOP, padx=3, pady=3)
            self.result.pack(side=tk.TOP, padx=3, pady=3)
        def calc(self):
            word = self.box.get()
            while len(word) != 0:
                i = random.randrange(0, len(word))
                self.globvar.set(word[i])
                word = word[0:i] + word[i+1:]
    
    class MainApp(object):
        def __init__(self,master=None):
            self.master=master
            app=self.app=tk.Tk()
            app.title("Mkee's Tools")
            app.geometry('500x500')
            menubar=tk.Menu(app)
            self.shuffle=Shuffle(master)
            self.current=self.shuffle
            program_menu=tk.Menu(menubar)
            program_menu.add_command(label='Shuffle',command=self.show_shuffle)
            menubar.add_cascade(label='Programs', menu=program_menu)
            app.config(menu=menubar)
        def show_shuffle(self):
            self.current.hide()
            self.current=self.shuffle
            self.shuffle.show()
        def show_buttons(self):
            self.current.hide()
            self.current=self.buttons        
            self.buttons.show()
    
    def main():
        m=MainApp()
        m.app.mainloop()
    
    if __name__=='__main__':
        main()