簡體   English   中英

另一個類中的tkinter變量

[英]tkinter variable in another class

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

如果我是你,我會這樣做:

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

您可能已經注意到,我在兩次使用IntVarget()set()方法(在您的版本中我通過我們制作的Store接口執行此操作),因此您不需要使用新變量(如self.counter)因為我們實例化的變量是存儲數據。

我使用的另一件事是lambda表達式而不是完整的函數定義,因為我們只想獲取當前值,將其加1,並將其存儲為新值。

而在我的版本中, Main類是原始的子類tkinter.Tk類-這就是為什么我把它的__init__里面方法Main__init__方法。

你的問題是你有一個方法和一個名為counter的變量。 單擊該按鈕時,不會調用您的函數,因此未設置該變量。 在創建按鈕時, self.counter認為self.counter是變量而不是命令。

這個特殊問題的解決方案是重命名函數或變量。 然后它應該按預期工作。

要回答關於“太多自我”的問題:你需要使用self,以便python知道你所引用的對象應該在對象的特定實例中的任何地方都可用。 所以,是的,你需要所有那些自我,如果你想引用它們所定義的函數之外的變量。

至於方法定義中的自我,那些也是必要的。 當你執行object.method() ,python會自動發送一個對象的引用作為方法的第一個參數,以便該方法具體知道正在對哪個方法起作用。

如果你想更多地了解“自我”的用法,那么這里有一個與自我相關的具體問題:自我的目的是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM