我正在用tkinter模块编写一些GUI代码。 我的问题是我想在不单击按钮的情况下阅读条目输入。 这样,条目输入将被自动写入.txt文件。 例如: 如果输入'a',则文本文件应附加char'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()
答案 0 :(得分:1)
如果您希望每当Entry
小部件的内容发生更改时便要执行某些操作,则最常见的解决方案是将tkinter变量与条目相关联,然后在变量上放置跟踪-跟踪可以每当变量更改时调用一个函数。
例如,在创建name
变量之后,首先添加以下行:
name.trace("w", writefile)
只要值更改,这将导致writefile
被调用。
当跟踪调用该函数时,它将传递几个变量。您的函数不使用变量,但需要接受它们,因此将函数签名修改为如下所示:
def writefile(*args):
有关这些参数的更多信息,请参见What are the arguments to Tkinter variable trace method callbacks?
最后,如果您希望文件反映条目小部件中的内容(而不是每次修改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将自动更新。
答案 1 :(得分:0)
请参考以下代码。您可以对writefile
函数进行稍作修改,就像我在下面所做的那样,作为trace
中tk.StringVar
方法的回调。
希望这会有所帮助。
import tkinter as tk
def writefile():
with open("./name.txt", "r+") as f:
f.truncate(0)
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)
frame.pack()
name = tk.StringVar()
name.trace("w", lambda l, idx, mode: writefile())
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()
entry.pack()
root.mainloop()