Python 2.7.2全局变量&x2B;特金特

Python 2.7.2全局变量&x2B;特金特,python,tkinter,global-variables,python-2.7,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.Entr

我对全局变量有一些问题:

#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。 我做错了什么

  • 要更新标签,请设置
    textvariable=self.globvar
    ,其中
    self.globvar=tk.StringVar()
    。通过调用
    self.globvar.set
    更新标签文本
  • command=self.calc()
    更改为
    command=self.calc
    (不带 括号)。使用括号时,将调用self.calc()
    self.buttn
    已定义。和命令设置为的返回值
    self.calc()
    ,它是
    None
    。按下按钮时不会发生任何事情 按下是因为
    命令
    等于
    。没有括号,
    命令
    设置为函数对象
    self.calc
    ,并且 每当按下按钮时(正确地)调用函数
  • 尽量避免使用全局变量。它将有助于
    Shuffle
    实现自包含、更易于重用和导入

  • 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()