【问题标题】:How to avoid global variables and static methods using __init__ method?如何避免使用 __init__ 方法的全局变量和静态方法?
【发布时间】:2015-11-26 02:40:57
【问题描述】:

大家晚上好,

几周前我开始使用 Tkinter(所以我还没有真正理解它),我目前正在开发一个计数器程序:它应该通过按下某个按钮来增加变量 i 并用另一个按钮重置它(然后计算重置次数)。第三个按钮用于将当前计数器变量写入 txt 文件。

我第一次写它时没有__init__ 方法,这可能不优雅,但它有效:

from Tkinter import *

root = Tk()

global i, k
i = 0
k = 0

count = open('count.txt', 'w')
count.write("i   k\n")

output = Label(root, text="")
output.pack(side=RIGHT)


def nextnum():
        global i, k
        i += 1
        output.config(text="i=" + str(i) + ", k=" + str(k))


def reset():
        global i, k
        i = 0
        k += 1
        output.config(text="i=" + str(i) + ", k=" + str(k))


def write():
     count.write(str(i) + "   " + str(k) + "\n")


nextb = Button(root, text="next", command=nextnum)
nextb.pack(side=LEFT)

resetb = Button(root, text="reset i", command=reset)
resetb.pack(side=LEFT)

writeb = Button(root, text="write", command=write)
writeb.pack(side=LEFT)

root.mainloop() 

除了使用全局变量还有其他方法吗?我尝试使用 return 命令,但我遇到的问题是,每次按下计数器按钮,全局字典都不会更新。这样,我总是只打印第一轮,而不是计数变量。有什么办法让它这样运行吗?

如果我想将字符串保存在 txt 文件中怎么办?用全局变量来做这件事似乎可行,但又显得不够优雅。

我还尝试了__init__ 方法,但有问题。它告诉我,我定义的子函数是静态的,这似乎来自 output.config() 命令,但我不太确定(我认为这与它有关,因为它告诉我输出和count 是未解析的引用)。它也不能在我的 txt 文件中执行 .write() 命令。

import Tkinter as Tk


class MainApp(Tk.Frame):
    def __init__(self, parent):
        Tk.Frame.__init__(self, parent)
        self.root = parent
        self.root.title("Main frame")
        self.frame = Tk.Frame(parent)
        self.frame.pack()

        global i, k
        i = 0
        k = 0

        count = open('count.txt', 'w')
        count.write("i   k\n")

        nextb = Tk.Button(self.frame, text="Next number", command=self.nextnum)
        nextb.pack()

        resetb = Tk.Button(self.frame, text="Reset i", command=self.reset)
        resetb.pack()

        writeb = Tk.Button(self.frame, text="Write to file", command=self.write)
        writeb.pack()

        output = Tk.Label(self.frame, text="i=" + str(i) + ", k=" + str(k))
        output.pack()

    def nextnum(self):
        global i
        i += 1
        output.config(text="i=" + str(i) + ", k=" + str(k))

    def reset(self):
        global i, k
        i = 0
        k += 1
        output.config(text="i=" + str(i) + ", k=" + str(k))

    def write(self):
        count.write(str(i) + "   " + str(k) + "\n")


if __name__ == "__main__":
    root = Tk.Tk()
    app = MainApp(root)
    root.mainloop() 

谁能告诉我这里出了什么问题以及为什么它不接受其他子功能中定义的标签?我应该怎么做来更新输出?还是我需要在每个子功能中调用我想要更改的标签?

感谢您的任何建议。

p.s.:事实上,这只是一个针对更大应用程序的测试程序,当她/他按下按钮并将数据从仪器读取到文件中时,我需要为用户提供特定信息当按下另一个按钮时。

【问题讨论】:

    标签: python tkinter global-variables


    【解决方案1】:

    您需要了解变量作用域。您在 __init__ 方法中定义 output,因此它仅对该方法是本地的;一旦完成,该变量将被销毁,并且在其他任何地方都无法使用。

    但是__init__ 和其他方法都是同一个类的一部分;类的全部要点之一是您可以设置实例变量。在这种情况下,您要分配给self.output,并在nextnum 和reset 中引用它。

    真的,你应该对i 和k 做同样的事情,那么你根本不需要任何全局声明。

    【讨论】:

    • 谢谢你的回答,我想我明白了,你的意思。
    猜你喜欢
    • 2014-12-19
    • 2011-01-17
    • 2011-05-12
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多