1

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()
4

2 回答 2

3

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

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

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

至于方法定义中的 self ,这些也是必要的。当您这样做时object.method(),python 将自动发送对该对象的引用作为方法的第一个参数,以便该方法明确知道正在执行哪个方法。

如果你想了解更多关于“self”的使用,这里有一个与self相关的具体问题:self的目的是什么?

于 2013-09-12T17:38:28.217 回答
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()

正如您可能注意到的,我在这两次中都使用了theget()和实例化是存储数据。set()IntVarStore

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

在我的版本中,Main该类是原始类的子类——这就是为什么我在'方法中tkinter.Tk称它为方法。__init__Main__init__

于 2013-09-12T16:26:17.900 回答