Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无需按钮直接处理Tkinter输入?_Python_Tkinter_Tkinter Entry - Fatal编程技术网

Python 无需按钮直接处理Tkinter输入?

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

我正在用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()

如果希望在
条目
小部件的内容发生更改时执行某些操作,最常见的解决方案是将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”。我就是不明白,代码怎么能不断地“更新”我的函数。