0

我试图在一个类中设置一个变量,然后用一个类方法更新它,

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。

4

2 回答 2

0

您已创建xy作为类变量。你传递给你的函数只是函数参数x,它们既不属于类也不属于实例。y__init__

现在,如果您确实想访问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()
于 2019-02-06T09:52:02.263 回答
0

我尝试稍微更改您的代码。首先,当您的“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-06T09:55:07.800 回答