Сохранение ввода из поля ввода в текстовые файлы - PullRequest
0 голосов
/ 02 июля 2018

Я хочу сохранить входную форму из поля ввода в .txt файлах, и она работает с первым кодом, а не со вторым кодом, но мне нужно использовать второй код.

Код 1:

import tkinter as tk

def f():
    def save():
        a = t.get()
        f = open((a + '.txt'), 'w')
        f.write(a)
        f.close()
        return

   top = tk.Tk()
   t = tk.StringVar()
   e = tk.Entry(top, textvariable = t).pack()
   b = tk.Button(top, text = 'Save as a file', command = save).pack()
   top.mainloop()
f()

Код 2:

import tkinter as tk

root = tk.Tk()

def f():
    def save():
        a = t.get()
        f = open((a + '.txt'), 'w')
        f.write(a)
        f.close()
        return

    top = tk.Tk()
    t = tk.StringVar()
    e = tk.Entry(top, textvariable = t).pack()
    b = tk.Button(top, text = 'Save as a file', command = save).pack()
    top.mainloop()

button = tk.Button(root, text="Button",command=f).pack()
root.mainloop()

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы путаете свою переменную с полем ввода: использование более подходящих имен переменных помогает. Вы также пишете file_name в файле, который создаете с этим именем ... Неясно, действительно ли это то, что вы хотели. Вы также упаковываетесь в той же строке, что и присвоение переменной e - pack(), возвращает None
По какой-то причине вы также запустили два основных цикла; не делай этого, это плохая идея.

import tkinter as tk

def save():
    file_name = entry.get()
    with open(file_name + '.txt', 'w') as file_object:
        file_object.write(file_name)   # it is unclear if writing the file_name in the newly created file is really what you want.

if __name__ == '__main__':
    top = tk.Tk()
    entry_field_variable = tk.StringVar()
    entry = tk.Entry(top, textvariable=entry_field_variable)
    entry.pack()
    tk.Button(top, text="save", command=save).pack()

    top.mainloop()

Я удалил вложенные функции; если вы чувствуете необходимость сделать это, возможно, вам следует использовать вместо этого класс.
Я также изменил открытие / закрытие файла на менеджер контекста, который его обрабатывает.

0 голосов
/ 02 июля 2018
import tkinter as tk

def f():
    def save():
        a = t.get()
        with open((a + '.txt'), 'w') as f: 
            f.write(a)

    top = tk.Tk()
    t = tk.StringVar(top)
    tk.Entry(top, textvariable=t).pack()
    tk.Button(top, text = 'Save as a file', command=save).pack()

root = tk.Tk()
tk.Button(root, text="Button", command=f).pack()
root.mainloop()

Наиболее важным изменением является t = tk.StringVar() -> t = tk.StringVar(top), определяющее главный виджет. Есть несколько других изменений (например, pack() возвращает None, поэтому не устанавливайте значения на его основе, используйте менеджер контекста для закрытия файла)

0 голосов
/ 02 июля 2018

Вы не вызываете функцию save () во втором коде. Добавление save() call после определения решит вашу проблему.

Ваш код:

def f():
    def save():
        a = t.get()
        f = open((a + '.txt'), 'w')
        f.write(a)
        f.close()
        return

исправлено:

def f():
    def save():
        a = t.get()
        f = open((a + '.txt'), 'w')
        f.write(a)
        f.close()
        return
    save()
...