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()
答案 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?