Python 2.7.2 全局变量 +特金特
我在使用全局变量时遇到了一些问题:
#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 globvar = 0 。 我做错了什么?
I'm having some problems with the global variables:
#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()
I get the problem when I click the buttonself.buttn = tk.Button(master, text="Done", width=10, command=self.calc())
. I want to make the self.result = tk.Label(self.master, text=globvar)
show the globvar taken from calc, but instead it shows the globvar that is set before the classglobvar = 0
.
What am I doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
textvariable=self.globvar
,其中self.globvar = tk.StringVar()
。通过调用 self.globvar.set 来更新标签文本。command=self.calc()
更改为command=self.calc
(不带括号)。带括号,此时调用
self.calc()
self.buttn
已定义。并且命令被设置为返回值self.calc()
,即None
。当按钮按下时没有任何反应按下,因为
command
等于None
。没有括号,command
设置为函数对象self.calc
,并且每当按下按钮时,函数就会被(正确地)调用。
Shuffle
变得独立,更容易重用和导入。textvariable=self.globvar
, whereself.globvar = tk.StringVar()
. The Label text is updated by callingself.globvar.set
.command=self.calc()
tocommand=self.calc
(withoutparentheses). With parentheses,
self.calc()
is called at the timeself.buttn
is defined. And command gets set to the return value ofself.calc()
, which isNone
. Nothing happens when the button ispressed because
command
equalsNone
. Without parentheses,command
is set to the function objectself.calc
, and thefunction is called (correctly) whenever the button is pressed.
Shuffle
to be self-contained, more easily reusable and importable.