我想设置一个类中的变量,然后用一个类的方法更新,
class App:
x = 2
y = 2
def __init__(self, master, x, y):
for i in range(x):
for j in range(y):
b = Entry(master)
b.grid(row=i, column=j)
Button(text='Add ', command=self.enlarge).grid(row=height,
column=width)
Button(text='Remove', command=self.shrink).grid(row=height,
column=width - 1, sticky="e")
@classmethod
def enlarge(cls):
cls.x += 1
@classmethod
def shrink(cls):
cls.x -= 1
root = Tk()
app = App(root)
mainloop()
尽管这些方法更新X,它没有更新我的初始化函数的全局x。
我试图改变你的代码一点点。首先,当你的类“应用程序”里面的X是改变了一个额外的行不自动不重新加载窗口追加。我假设你有另一个功能重新加载窗口x变化时。如果没有,你可以再次调用的init()。
现在,改变的代码(python3):
from tkinter import Entry, Button
import tkinter as tk
class App:
x = 2
y = 2
def __init__(self, master):
self.master = master
self.topFrame = tk.Frame(master)
self.topFrame.grid(row = 0, columnspan = 2)
for i in range(self.x):
for j in range(self.y):
b = Entry(self.topFrame)
b.grid(row=i, column=j)
Button(self.topFrame, text='Add ', command=self.enlarge).grid(row=2,
column=2)
Button(self.topFrame, text='Remove', command=self.shrink).grid(row=2,
column=2 - 1, sticky="e")
def enlarge(self):
self.x += 1
self.topFrame.destroy()
self.__init__(self.master)
def shrink(self):
self.x -= 1
self.topFrame.destroy()
self.__init__(self.master)
root = tk.Tk()
app = App(root)
tk.mainloop()
需要注意的是init()方法被调用,以重新加载窗口。基本上,x和y的参数从init()方法除去,成为类“应用”的属性
您已经创建x
和y
as类变量。该x
和y
要传递到您的__init__
功能仅仅是函数的参数,它们既不属于类,也不实例。
现在,如果你想访问初始化x和y类变量,你可以使用self
或self.__class__
访问它。但是,千万注意,如果您使用相同的名称,类变量,如果实例变量您尝试使用自访问它们,然后实例变量将被首先选择时,只有当没有找到相同名字的实例变量,类变量被认为是。
我创建了一个简单的例子出来张贴到了如何访问您的初始化函数类变量的代码。检查它下面:
class App:
x = 2
y = 2
def __init__(self):
for i in range(self.__class__.x):
for j in range(self.__class__.y):
print ("%s %s" %(i,j))
@classmethod
def enlarge(cls):
cls.x += 1
@classmethod
def shrink(cls):
cls.x -= 1
app = App()