如何在函数内部使用变量而不将其声明为全局变量

时间:2017-08-31 03:18:51

标签: python-3.x tkinter

我有两个问题(如果不允许的话,我真的只需要第一部分回答)

我有以下示例代码

import tkinter as tk

window = tk.Tk()

def countIncrease():
    count +=1
    t1.insert(tk.END,count)

count = 0
t1=tk.Text(window,height=3,width=30)
t1.grid(row=0,column=0,columnspan=3)

b1=tk.Button(window,text="+",height=3,width=10,command=countIncrease)
b1.grid(row=1,column=0)

window.mainloop()

如果我执行此代码,则会收到错误UnboundLocalError: local variable 'count' referenced before assignment

我知道我可以通过向函数

添加global count来解决这个问题

在我这样做之后,当我按下按钮时,输出为1,重复按下产生12,123,1234,12345等。

我的第一个(也是主要的)问题是,我知道将变量设为全局是不好的做法。如何在不计算全局变量的情况下完成这项工作的正确方法是什么?

我的第二个问题是如何让屏幕“刷新”,因此它只显示最新的变量,即而不是123只是3。

1 个答案:

答案 0 :(得分:1)

如果您不想使用class变量,则应重新构建代码以使用count并使global成为类变量。要“刷新”屏幕/ tkinter text,您需要在插入新内容之前删除内容。

以下是解决这两个问题的一种方法:

import tkinter as tk

class app():
    def __init__(self, parent):
        self.count = 0
        self.t1=tk.Text(parent, height=3,width=30)
        self.t1.grid(row=0,column=0,columnspan=3)

        self.b1=tk.Button(parent,text="+",height=3,width=10,command=self.countIncrease)
        self.b1.grid(row=1,column=0)

    def countIncrease(self):
        self.count +=1
        self.t1.delete('1.0', tk.END) #refresh/delete content of t1
        self.t1.insert(tk.END,self.count)

window = tk.Tk()
app(window) # Create an instance of app
window.mainloop()