Сохранение записей GUI в текстовый файл

Это первый раз, когда я использую tkinter и графический интерфейс в Python, так что я в значительной степени новичок.

У меня есть большая форма с графическим интерфейсом, которую я сделал с помощью tkinter. Он использует все классические виджеты tkinter: текстовые поля ввода, счетчики, меню параметров, переключатели и кнопки проверки. Что я хочу сделать, так это позволить пользователю вводить данные в форму графического интерфейса, а затем нажимать кнопку «Сохранить», чтобы сохранить все в текстовый файл. К сожалению, я не могу найти много примеров сохранения таких данных в текстовый файл. Вот общий пример моего кода.

import tkinter as tk
from tkinter import ttk

variables = dict()

root = tk.Tk()
root.title('Generic Form')
root.columnconfigure(0, weight=1)

ttk.Label(root, text='Generic Form', font=("TkDefaultFont", 16)).grid()

drf = ttk.Frame(root)
drf.grid(padx=10, sticky=(tk.N + tk.S))
drf.columnconfigure(0, weight=1)

g_info = ttk.LabelFrame(drf, text='Generic Data')
g_info.grid(row=0, column=0, sticky=(tk.W + tk.E))

variables['Scenario ID'] = tk.StringVar()
ttk.Label(g_info, text='Scenario ID').grid(row=0, column=0)
ttk.Entry(g_info, textvariable=variables['Scenario ID']).grid(row=1, column=0, sticky=(tk.W + tk.E))

variables['Integer Value'] = tk.IntVar()
ttk.Label(g_info, text='Integer Value').grid(row=2, column=0)
ttk.Spinbox(g_info, textvariable=variables['Integer Value'], from_=0, to=100, increment = 1).grid(row=3, column=0, sticky=(tk.W + tk.E))

variables['OPTIONS'] = tk.StringVar()
option_var = tk.StringVar(value='Choose')
choices = ('This', 'That', 'The Other Thing')
ttk.Label(g_info, text='OPTIONS').grid(row=4, column=0, sticky=(tk.W + tk.E))
ttk.OptionMenu(g_info, option_var, *choices).grid(row=5, column=0, sticky=(tk.W + tk.E))

choice_default = tk.StringVar(value=F)
variables['CHOICE'] = tk.StringVar()
choice_frame = ttk.Frame(g_info)
ttk.Label(g_info, text='CHOICE').grid(row=6, column=0, sticky=(tk.W + tk.E))
choice_frame.grid(row=7, column=0, sticky=(tk.W + tk.E))
for choice in ('T', 'F'):
    ttk.Radiobutton(choice_frame, value=choice, test=choice, variable=choice_default.pack()

buttons = tk.Frame(drf)
buttons.grid(column=1, pady=20, sticky=(tk.W + tk.E))
save_button = ttk.Button(buttons, test='Save')
save_button.pack(side=tk.RIGHT)

def on_save():
   filename = f'C:/test.txt'
   data = dict()
   with open(filename, 'w', newline='' as fh:
      fh.write("\n")

save_button.configure(command=on_save)
root.mainloop()

Вот выходной текст, который я пытаюсь получить.

Generic Data
  Scenario ID = Scenario 1
  Integer Value = 51
  Options = The Other Thing
  Choice = T

Большая часть того, что я знаю о tkinter, взята из книги Алана Д. Мура «Программирование графического интерфейса Python с помощью Tkinter». К сожалению, в этой книге описывается только сохранение данных в файл CSV. Для проекта, над которым я работаю, мне нужно сохранить его в текстовом файле. Я знаю, что есть способ сделать это, но я не могу найти никаких примеров, кроме виджета Entry.

Вы знаете, как добавить обратный вызов на кнопку (которую я здесь не вижу) с помощью command=? В этом случае нужно просто получить значения с помощью variables[xxx].get() и записать их, как любой другой файл. Здесь нет ничего волшебного.

Tim Roberts 30.06.2023 00:08

Обратите внимание, что CSV также является текстовым файлом. Я не понимаю, в чем твоя проблема.

acw1668 30.06.2023 01:17

Моя проблема в том, что когда я пытаюсь сохранить форму GUI в формате txt, а не в формате csv, все, что я получаю, это пустой текстовый файл.

cat_herder 30.06.2023 03:06

Пожалуйста, покажите нам код, который вы пробовали.

Bryan Oakley 30.06.2023 03:30

Гм, код, который я пробовал, прямо выше.

cat_herder 30.06.2023 03:37

В вашем размещенном коде нет кода для сохранения в файл.

acw1668 30.06.2023 03:59

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

cat_herder 30.06.2023 04:25

Вы просто открываете файл, а затем пишете только новую строку.

acw1668 30.06.2023 04:34

Разве это не то, что у меня есть в коде? Я открыл новый файл и написал в него новую строку.

cat_herder 30.06.2023 04:39

Я имею в виду, что именно поэтому вы получаете пустой файл.

acw1668 30.06.2023 06:39

Да, я прошу помощи! Что тебе в этом непонятно? Я пытаюсь сохранить записи в текстовый файл. Почему здесь никто не может помочь мне, не будучи оскорбительным снобом?

cat_herder 30.06.2023 06:50

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

Tim Roberts 30.06.2023 21:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
12
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это исправляет одну или две опечатки в вашем коде и добавляет кнопку «Сохранить», которая записывает значения в консоль. Запись его в текстовый файл оставлена ​​читателю в качестве упражнения.

import tkinter as tk
from tkinter import ttk

variables = dict()

root = tk.Tk()
root.title('Generic Form')
root.columnconfigure(0, weight=1)

ttk.Label(root, text='Generic Form', font=("TkDefaultFont", 16)).grid()

drf = ttk.Frame(root)
drf.grid(padx=10, sticky=(tk.N + tk.S))
drf.columnconfigure(0, weight=1)

g_info = ttk.LabelFrame(drf, text='Generic Data')
g_info.grid(row=0, column=0, sticky=(tk.W + tk.E))

variables['Scenario ID'] = tk.StringVar()
ttk.Label(g_info, text='Scenario ID').grid(row=0, column=0)
ttk.Entry(g_info, textvariable=variables['Scenario ID']).grid(row=1, column=0, sticky=(tk.W + tk.E))

variables['Integer Value'] = tk.IntVar()
ttk.Label(g_info, text='Integer Value').grid(row=2, column=0)
ttk.Spinbox(g_info, textvariable=variables['Integer Value'], from_=0, to=100, increment = 1).grid(row=3, column=0, sticky=(tk.W + tk.E))

variables['OPTIONS'] = tk.StringVar()
option_var = tk.StringVar(value='Choose')
choices = ('This', 'That', 'The Other Thing')
ttk.Label(g_info, text='OPTIONS').grid(row=4, column=0, sticky=(tk.W + tk.E))
ttk.OptionMenu(g_info, option_var, *choices).grid(row=5, column=0, sticky=(tk.W + tk.E))

choice_default = tk.StringVar(value='F')
variables['CHOICE'] = tk.StringVar()
choice_frame = ttk.Frame(g_info)
ttk.Label(g_info, text='CHOCE').grid(row=6, column=0, sticky=(tk.W + tk.E))
choice_frame.grid(row=7, column=0, sticky=(tk.W + tk.E))
for choice in 'TF':
    ttk.Radiobutton(choice_frame, value=choice, variable=choice_default).pack()

def save():
    scen = variables['Scenario ID'].get()
    intval = variables['Integer Value'].get()
    opt = variables['OPTIONS'].get()
    choice = variables['CHOICE'].get()
    print( "Generic Data" )
    print( f"  Scenario ID = {scen}" )
    print( f"  Integer Value = {intval}" )
    print( f"  Options = {opt}" )
    print( f"  Choice = {choice}" )

tk.Button( g_info, text = "Save", command=save).grid(row=7, column=0)

root.mainloop()

Ваш код не работает должным образом. Во-первых, мне пришлось изменить строку кнопки «Сохранить» на 8, потому что она закрывает рамку выбора в строке 7. Но, кроме того, записи, сделанные для идентификатора сценария и целочисленного значения, выводятся на консоль, но значения для параметров и Выбор пуст.

cat_herder 30.06.2023 03:35

Ну, это из-за других ошибок, которые ты сделал. Вы не привязывали переменную OPTIONS к OptionMenu и не привязывали опцию CHOICE к Radiobutton. Я думаю, вы можете увидеть, как сделать печать и как подключить ее к вашему пользовательскому интерфейсу, о чем вы просили.

Tim Roberts 30.06.2023 07:27

Нет, я попросил совета, как сохранить записи в текстовый файл, как в примере, который я привел ниже своего кода. Но вместо того, чтобы помочь мне, ты решил быть снисходительным придурком. Вместо того, чтобы исправить некоторые ошибки в моем коде, вы добавили новые, а затем сказали мне разобраться в проблеме самостоятельно. Спасибо за ничего.

cat_herder 30.06.2023 15:09

Что не так с этим ответом? Из того, что я вижу, он предоставил вам функцию save, чтобы делать именно то, что вы просили, и все, что вам нужно сделать, это заменить метод print на метод write.

Rory 30.06.2023 15:56

Я не был снисходительным ни в малейшей степени, хотя я, конечно, могу быть. Мы здесь не для того, чтобы писать код за вас. Мы здесь, чтобы привести вас к результату, и я определенно сделал именно это.

Tim Roberts 30.06.2023 21:00

О да, у вас есть. Я пришел сюда за помощью с библиотекой, с которой никогда раньше не работал. Но вместо того, чтобы дать мне совет, вы добавили ошибки в мой код, а затем дали мне домашнее задание. Я был репетитором по математике в колледже и не относился так ни к одному из студентов, с которыми работал.

cat_herder 01.07.2023 01:46
Ответ принят как подходящий

После некоторых проб и ошибок я наконец нашел решение и могу опубликовать ответ. Позвольте мне прояснить: этот ответ никоим образом не принадлежит никому, кто ответил на этот пост. Я заранее заявил, что я новичок в tkinter, но все, кто ответил (acw1668, Рори, Брайан Окли и особенно Тим Робертс), относились ко мне как к шуту. Вы все умалчивали о проблеме, только давали мне самые туманные намеки на то, что я делаю неправильно, и не предлагали никаких решений. Всем спасибо не за что. Примите мое глубочайшее снисхождение, потому что это все, что вы мне дали.

import tkinter as tk
from tkinter import ttk

variables = dict()

root = tk.Tk()
root.title('Generic Form')
root.columnconfigure(0, weight=1)

ttk.Label(root, text='Generic Form', font=("TkDefaultFont", 16)).grid()

drf = ttk.Frame(root)
drf.grid(padx=10, sticky=(tk.N + tk.S))
drf.columnconfigure(0, weight=1)

frame_info = ttk.LabelFrame(drf, text='Generic Data')
frame_info.grid(row=0, column=0, sticky=(tk.W + tk.E))

variables['Scenario ID'] = tk.StringVar()
ttk.Label(frame_info, text='Scenario ID').grid(row=0, column=0)
ttk.Entry(frame_info, textvariable=variables['Scenario ID']).grid(row=1, column=0, sticky=(tk.W + tk.E))

variables['Integer Value'] = tk.IntVar()
ttk.Label(frame_info, text='Integer Value').grid(row=2, column=0)
ttk.Spinbox(frame_info, textvariable=variables['Integer Value'], from_=0, to=100, increment = 1).grid(row=3, column=0, sticky=(tk.W + tk.E))

variables['OPTIONS'] = tk.StringVar()
option_var = tk.StringVar(value='Choose')
choices = ('Choose', 'This', 'That', 'The Other Thing')
ttk.Label(frame_info, text='OPTIONS').grid(row=4, column=0, sticky=(tk.W + tk.E))
ttk.OptionMenu(g_info, variables['OPTIONS'], *choices).grid(row=5, column=0, sticky=(tk.W + tk.E))

choice_default = tk.StringVar(value='F')
variables['CHOICE'] = tk.StringVar()
choice_frame = ttk.Frame(frame_info)
ttk.Label(frame_info, text='CHOICE').grid(row=6, column=0, sticky=(tk.W + tk.E))
choice_frame.grid(row=7, column=0, sticky=(tk.W + tk.E))
for choice in ('T', 'F'):
    ttk.Radiobutton(choice_frame, value=choice, variable=variables['CHOICE']).pack()

def on_save():
    
    
    inc = variables['Scenario ID'].get()
    number = variables['Integer Value'].get()
    menu = variables['OPTIONS'].get()
    boolean = variables['CHOICE'].get()
    
    with open('GUI.txt', 'w') as x:
        x.write( 'Generic Data' ), x.write('\n')
        x.write( f'  Scenario ID = {inc}' ), x.write('\n')
        x.write( f'  Integer Value = {number}' ), x.write('\n')
        x.write( f'  Options = {menu}' ), x.write('\n')
        x.write( f'  Choice = {boolean}' ), x.write('\n')

tk.Button(frame_info, text='Save', command=on_save).grid(row=8, column=0, sticky=(tk.W + tk.E))

root.mainloop()

В ваши жалобы было бы легче поверить, если бы ваш код не выглядел так же, как мой.

Tim Roberts 01.07.2023 07:28

Другие вопросы по теме

Алгоритм рисования работает с обычным контекстом устройства, но не с совместимым контекстом устройства + StretchBlt
Тестирование адаптивного дизайна: ручное перетаскивание окна браузера и использование панели инструментов устройства
JLabel не щелкает в нужном месте при реализации mouseReleased()
Выравнивание текста строки по десятичной точке (Swift)
Окно Tk не закроется после window.quit() и приведет к сбою программы
Как распечатать вывод моей модели MediaPipe в графическом интерфейсе Tkinter? ЖестРекогнизерресулт печатается в терминале и отображается только как переменная NoneType
Как добавить кнопку отображения информации на панель инструментов интерактивного графика
Tkinter, wm_state('zoomed') не работает в моем приложении
Как я могу повторно использовать логику для обработки нажатия клавиши и нажатия кнопки в графическом интерфейсе Python tkinter?
В Android Compose, как сделать так, чтобы кнопка выравнивалась по нижней части экрана, но при этом оставалась внизу прокручиваемого содержимого?