Python 2.7.2 全局变量 + tkinter

标签 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. 要更新标签,请设置 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 变得独立,更容易重用和导入。

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

关于Python 2.7.2 全局变量 + tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865682/

相关文章:

python - 如何从 Sqlite 检索带撇号的值

python - TypeError : list indices must be integers or slices,不是str字典python

python - Tkinter 和 Tix 演示或展示应用程序?

javascript - 无法在 JavaScript 的函数内访问函数中的变量

Javascript 全局引用错误

python - 在列表中搜索字母

python - 在 Flask-Login token_loader 中加载 token 引发 "BadTimeSignature: timestamp missing"

python - 为什么 StringVar().get() 在 python 中返回空值?

python-3.x - 下拉菜单更改顺序并每次删除一个选项 - Python

unit-testing - Jest 单元测试中的全局变量