gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:19:12 25 4
gpt4 key购买 nike

大家晚上好

我几周前开始使用 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() 命令,但我对此不太确定(我认为它与它有关,因为它告诉我输出和计数是 Unresolved 引用)。它也无法对我的 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.:事实上,这只是一个更大应用程序的测试程序,当她/他按下按钮并将数据(从仪器中读出)写入文件时,我需要向用户提供某些信息当按下另一个按钮时。

最佳答案

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

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

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

关于python - 如何避免使用 __init__ 方法的全局变量和静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com