如何使用__init__方法避免全局变量和静态方法



大家晚上好,

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

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

from Tkinter import *
root = Tk()
global i, k
i = 0
k = 0
count = open('count.txt', 'w')
count.write("i   kn")
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()命令,但我对此不太确定(我认为这与此有关,因为它告诉我output和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   kn")
        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.:事实上,这只是一个更大应用程序的测试程序,当用户按下一个按钮时,我需要向用户提供特定的信息,并在按下另一个按钮的时候将从仪器读取的数据写入文件。

您需要了解变量范围。您在__init__方法中定义了output,因此它仅是该方法的本地;一旦完成,变量就会被销毁,并且它在其他任何地方都不可用。

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

实际上,您应该对ik执行同样的操作,这样就根本不需要任何全局声明。

相关内容

  • 没有找到相关文章

最新更新