[英]Setting a variable in a class and updating it with a method in python to re-use in the class
我正在尝试在一个类中设置一个变量,然后使用类方法对其进行更新,
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。
您已经创建了x
和y
作为类变量。 您传递给__init__
函数的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()
我尝试过一点更改您的代码。 首先,当更改类“ 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”的属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.