Python 无需按钮直接处理Tkinter输入?
我正在用tkinter模块编写一些GUI代码。 我的问题是我想读取条目输入,而不点击按钮。 因此,条目输入将自动写入.txt文件。 例如: 如果我键入“a”,文本文件应附加字符“a”Python 无需按钮直接处理Tkinter输入?,python,tkinter,tkinter-entry,Python,Tkinter,Tkinter Entry,我正在用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 be
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()
如果希望在
条目
小部件的内容发生更改时执行某些操作,最常见的解决方案是将tkinter变量与条目相关联,然后对变量进行跟踪——只要变量发生更改,跟踪就可以调用函数
例如,首先在创建name
变量后添加此行:
name.trace("w", writefile)
这将导致每当值更改时调用writefile
当跟踪调用函数时,它将传递几个变量。您的函数不使用变量,但需要接受它们,因此修改函数签名,使其如下所示:
def writefile(*args):
def writefile(*args):
with open("/home/max/writeThings/name.txt", "w") as f:
f.writelines(name.get())
print("File has been written !")
有关这些参数的更多信息,请参阅
最后,如果希望文件反映条目小部件中的内容(而不是每次修改条目时都添加新行),则需要将open
语句的模式更改为w
,而不是a+
,以便每次调用时都用新值覆盖文件
最后一个函数应该如下所示:
def writefile(*args):
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将自动更新。请参考下面的代码。您可以使用writefile
函数作为tk.StringVar
中trace
方法的回调,只需稍加修改
希望这有帮助
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()
使用event
来解决此问题,如果用户输入“abc”,会发生什么?该文件是否包含“a”后接“ab”后接“abc”,总共为“aababc”?如果用户输入“XYZ”,然后退格删除“YZ”,然后写“QR”,应该写什么?Kevin,我只需要文件附加文本,我会解决其余的问题,我已经有了主意。因此“abc”将导致“aababc”。我就是不明白,代码怎么能不断地“更新”我的函数。