直接处理Tkinter Entry输入而不使用Button?

时间:2019-06-13 16:36:10

标签: python tkinter tkinter-entry

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

2 个答案:

答案 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函数进行稍作修改,就像我在下面所做的那样,作为tracetk.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()
相关问题