我试图在一个类中设置一个变量,然后用一个类方法更新它,
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,它也不会更新init函数中的全局x。
发布于 2019-02-06 01:55:07
我试着修改了你的代码。首先,当您的类“App”中的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()方法中删除,成为类'App‘的属性。
发布于 2019-02-06 01:52:02
您已经将x
和y
创建为类变量。传递给您的x
函数和y
函数只是函数参数,它们既不属于类,也不属于实例。
现在,如果您想访问init中的x和y类变量,可以使用self
或self.__class__
访问它。但是,请注意,如果实例变量与类变量同名,并且尝试使用self访问它们,则将首先选择实例变量,只有在没有找到同名实例变量时,才会考虑类变量。
我用您发布的代码创建了一个简单的示例,演示如何访问init函数中的类变量。请检查如下:
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()
https://stackoverflow.com/questions/54550314
复制相似问题