Непосредственно обрабатывать ввод Tkinter без кнопки - PullRequest
0 голосов
/ 13 июня 2019

Я пишу некоторый код GUI с модулем tkinter. Моя проблема в том, что я хочу прочитать входные данные, не нажимая кнопку. Таким образом, входная запись будет автоматически записана в файл .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()

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Если вы хотите, чтобы какое-то действие происходило всякий раз, когда изменяется содержимое виджета Entry, наиболее распространенное решение - связать переменную tkinter с записью, а затем поместить трассировку в переменную - трассировка может вызвать функция всякий раз, когда переменная изменяется.

Например, начните с добавления этой строки после создания переменной name:

name.trace("w", writefile)

Это приведет к вызову writefile при каждом изменении значения.

Когда трассировка вызывает функцию, она передаст несколько переменных. Ваша функция не использует переменные, но должна принять их, поэтому измените сигнатуру функции так, чтобы она выглядела следующим образом:

def writefile(*args):

Для получения дополнительной информации об этих аргументах см. Каковы аргументы для обратных вызовов метода трассировки переменных Tkinter?

Наконец, если вы хотите, чтобы файл отражал то, что находится в виджете ввода (в отличие от добавления новой строки каждый раз, когда изменяется 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 автоматически обновится, когда функция вернется.

0 голосов
/ 13 июня 2019

Пожалуйста, используйте следующий код.Вы можете использовать функцию 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()
...