【问题标题】:Directly handle Tkinter Entry input without Button?直接处理没有Button的Tkinter Entry输入?
【发布时间】:2019-10-28 07:32:49
【问题描述】:

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

【问题讨论】:

  • 使用 event 到那个
  • 如果用户输入“abc”会发生什么?文件是否包含“a”后跟“ab”后跟“abc”,总共是“aababc”?如果用户输入“XYZ”,然后退格删除“YZ”,然后写入“QR”,应该写什么?
  • Kevin,我只需要文件附加文本,剩下的我会解决,我已经有了想法。
  • 因此“abc”将导致“aababc”。我只是不明白,代码如何不断“更新”我的功能。

标签: python tkinter tkinter-entry


【解决方案1】:

如果您希望在 Entry 小部件的内容更改时执行某些操作,最常见的解决方案是将 tkinter 变量与条目相关联,然后在变量上放置跟踪 - 跟踪可以调用每当变量发生变化时起作用。

例如,首先在创建name 变量后添加这一行:

name.trace("w", writefile)

这将导致 writefile 在值更改时被调用。

当跟踪调用函数时,它会传递几个变量。您的函数不使用变量,但它需要接受它们,因此修改函数签名如下所示:

def writefile(*args):

有关这些参数的更多信息,请参阅What are the arguments to Tkinter variable trace method callbacks?

最后,如果您希望文件反映条目小部件中的内容(而不是在每次修改 Entry 时添加新行),您需要将 open 语句的模式更改为 @987654329 @ 而不是 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 会自动更新。

【讨论】:

    【解决方案2】:

    请参考以下代码。您可以将writefile 函数稍加修改后用作tk.StringVartrace 方法的回调。

    希望这会有所帮助。

    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()
    

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      相关资源
      最近更新 更多