我正在使用 tkinter 模块编写一些 GUI 代码。 我的问题是我想读取条目输入,而不单击按钮。 这样条目输入将自动写入 .txt 文件。 例如: 如果我输入 'a' ,文本文件应附加字符 'a'
import tkinter as tk
def writefile():
with open("/home/max/writeThings/name.txt", "a+") as f:
f.writelines(name.get())
print("File has been written !")
root.update()
root = tk.Tk()
canvas = tk.Canvas(root,width = 800, height = 600)
canvas.pack()
frame = tk.Frame(root, bg = "yellow")
frame.place(relwidth = 1, relheight = 1)
name = tk.StringVar()
entry = tk.Entry(frame, textvariable = name, bg = "orange", font= "arial 18 ", justify = "center", fg = "black")
entry.place( relx = 0.25, rely = 0.05, relwidth = 0.5, relheight = 0.1)
entry.focus_set()
writefile()
root.mainloop()
最佳答案
如果您希望在 Entry
小部件的内容发生更改时执行某些操作,最常见的解决方案是将 tkinter 变量与该条目相关联,然后在该变量上进行跟踪 --每当变量发生变化时,跟踪就可以调用函数。
例如,在创建 name
变量后添加此行:
name.trace("w", writefile)
这将导致每当值发生变化时调用writefile
。
当跟踪调用该函数时,它将传递几个变量。您的函数不使用变量,但需要接受它们,因此将函数签名修改为如下所示:
def writefile(*args):
有关这些参数的更多信息,请参阅 What are the arguments to Tkinter variable trace method callbacks?
最后,如果您希望文件反射(reflect)条目小部件中的内容(而不是每次修改 Entry
时添加新行),则需要更改 的模式open
语句为 w
而不是 a+
,以便每次调用时都会用新值覆盖文件。
最终的函数应该如下所示:
def writefile(*args):
with open("/home/max/writeThings/name.txt", "w") as f:
f.writelines(name.get())
print("File has been written !")
注意:在此函数内调用 root.update()
是完全没有意义的,因为一旦函数返回,tkinter 就会自动更新。
关于python - 直接处理 Tkinter Entry 输入而不使用 Button?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585012/