大家晚上好,
几个星期前我开始使用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()命令,但我不太确定(我认为它与它有关,因为它告诉我输出和计数是未解析的引用)。它也不能将.write()命令放入我的txt文件中。
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()
任何人都可以说,这里有什么问题以及为什么它不接受其他子功能中定义的标签?我应该怎么做才能更新输出?或者我是否需要在每个子功能中调用我想要更改的标签?
感谢您的任何建议。
ps:事实上,这只是一个更大的应用程序的测试程序,当他/她按下按钮并写入数据,从仪器读出,到文件时,我需要给用户一定的信息当按下另一个按钮时。
答案 0 :(得分:2)
您需要了解变量范围。您在output
方法中定义__init__
,因此它仅对该方法是本地的;一旦完成,变量就会被破坏,并且它不能从其他任何地方获得。
但是__init__
和其他方法都属于同一个类;类的全部要点之一是您可以设置实例变量。在这种情况下,您希望分配到self.output
,并在nextnum
和reset
内引用该内容。
实际上,您应该对i
和k
执行相同操作,然后根本不需要任何全局声明。