另一个类中的tkinter变量

时间:2013-09-12 16:15:06

标签: python class methods tkinter ttk

Python 3.1,tkinter / ttk

我写了一些非常简单的东西,试图理解链接到小部件的tkinter变量如何存储在小部件的不同类中。代码如下。

问题:

1)为什么不按下按钮更改标签?

2)我需要这么多自我吗?每个方法中的变量是否可以在没有自我的情在一开始?

希望答案对其他tkinter新手来说是一次有用的学习练习......

from tkinter import *
from tkinter.ttk import *

root = Tk()

class Store:

    def __init__(self):
        self.v = IntVar()
        self.v.set(0)

    def set(self, v):
        self.v.set(v)

class Main:

    def __init__(self):

        self.counter = 0

        self.label = Label(root, textvariable = a.v)
        self.label.pack()

        self.button = Button(root, command = self.counter, text = '+1')
        self.button.pack()

    def counter(self):

        self.counter = self.counter + 1
        a.set(self.counter)

a = Store()
b = Main()

root.mainloop()

2 个答案:

答案 0 :(得分:2)

如果我是你,我会这样做:

import tkinter

root = tkinter.Tk()
var  = tkinter.IntVar()

label  = tkinter.Label(root, textvariable=var)
button = tkinter.Button(root, command=lambda: var.set(var.get() + 1), text='+1')

label.pack()
button.pack()

root.mainloop()

更新:

但是,如果你坚持用两个类(第一个类只是一个有点无意义的接口)来做这个,那么我会这样做:

import tkinter

class Store:
    def __init__(self):
        self.variable = tkinter.IntVar()

    def add(self, value):
        var = self.variable
        var.set(var.get() + value)
        return var.get()

class Main(tkinter.Tk):
    def __init__(self, *args, **kwargs):
        tkinter.Tk.__init__(self, *args, **kwargs)
        var = Store()
        self.label  = tkinter.Label(self, textvariable=var.variable)
        self.button = tkinter.Button(self, command=lambda: var.add(1), text='+1')
        self.label.pack()
        self.button.pack()


root = Main()
root.mainloop()

正如您可能注意到的那样,我在get()的{​​{1}}和set()两种方法中都使用了IntVar(在您的版本中我通过我们制作的Store界面执行此操作因此,您不需要使用新变量(如self.counter),因为我们实例化的变量存储数据。

我使用的另一件事是lambda表达式而不是完整的函数定义,因为我们只想获取当前值,向其添加1并存储它作为新的价值。

在我的版本中,Main类是原始tkinter.Tk类的子类 - 这就是为什么我在__init__的{​​{1}}内调用Main方法{ {1}}方法。

答案 1 :(得分:2)

您的问题是您同时拥有一个名为counter的方法和变量。单击该按钮时,不会调用您的函数,因此未设置该变量。在创建按钮时,tkinter认为self.counter是变量而不是命令。

此特定问题的解决方案是重命名函数或变量。然后它应该按预期工作。

回答关于“太多自我”的问题:你需要使用self,以便python知道你所引用的对象应该在对象的特定实例中的任何地方都可用。所以,是的,你需要所有那些自我,如果你想引用它们所定义的函数之外的变量。

至于方法定义中的自我,那些也是必要的。执行object.method()时,python会自动发送对象的引用作为方法的第一个参数,以便该方法具体知道正在对哪个方法起作用。

如果您想了解更多关于“自我”的使用,请在此处提出与自我相关的具体问题:What is the purpose of self?