Это первый раз, когда я использую 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.
Обратите внимание, что CSV также является текстовым файлом. Я не понимаю, в чем твоя проблема.
Моя проблема в том, что когда я пытаюсь сохранить форму GUI в формате txt, а не в формате csv, все, что я получаю, это пустой текстовый файл.
Пожалуйста, покажите нам код, который вы пробовали.
Гм, код, который я пробовал, прямо выше.
В вашем размещенном коде нет кода для сохранения в файл.
Я только что отредактировал код с кодом кнопки сохранения, который я использовал. Я изначально не включал его, потому что я явно делал что-то не так.
Вы просто открываете файл, а затем пишете только новую строку.
Разве это не то, что у меня есть в коде? Я открыл новый файл и написал в него новую строку.
Я имею в виду, что именно поэтому вы получаете пустой файл.
Да, я прошу помощи! Что тебе в этом непонятно? Я пытаюсь сохранить записи в текстовый файл. Почему здесь никто не может помочь мне, не будучи оскорбительным снобом?
Никто не был для вас оскорбительным снобом. Вы получаете бесплатную квалифицированную консультацию от компетентных инженеров. Если вы не можете участвовать здесь, не принимая все слишком близко к сердцу, то, возможно, это место не для вас.






Это исправляет одну или две опечатки в вашем коде и добавляет кнопку «Сохранить», которая записывает значения в консоль. Запись его в текстовый файл оставлена читателю в качестве упражнения.
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. Но, кроме того, записи, сделанные для идентификатора сценария и целочисленного значения, выводятся на консоль, но значения для параметров и Выбор пуст.
Ну, это из-за других ошибок, которые ты сделал. Вы не привязывали переменную OPTIONS к OptionMenu и не привязывали опцию CHOICE к Radiobutton. Я думаю, вы можете увидеть, как сделать печать и как подключить ее к вашему пользовательскому интерфейсу, о чем вы просили.
Нет, я попросил совета, как сохранить записи в текстовый файл, как в примере, который я привел ниже своего кода. Но вместо того, чтобы помочь мне, ты решил быть снисходительным придурком. Вместо того, чтобы исправить некоторые ошибки в моем коде, вы добавили новые, а затем сказали мне разобраться в проблеме самостоятельно. Спасибо за ничего.
Что не так с этим ответом? Из того, что я вижу, он предоставил вам функцию save, чтобы делать именно то, что вы просили, и все, что вам нужно сделать, это заменить метод print на метод write.
Я не был снисходительным ни в малейшей степени, хотя я, конечно, могу быть. Мы здесь не для того, чтобы писать код за вас. Мы здесь, чтобы привести вас к результату, и я определенно сделал именно это.
О да, у вас есть. Я пришел сюда за помощью с библиотекой, с которой никогда раньше не работал. Но вместо того, чтобы дать мне совет, вы добавили ошибки в мой код, а затем дали мне домашнее задание. Я был репетитором по математике в колледже и не относился так ни к одному из студентов, с которыми работал.
После некоторых проб и ошибок я наконец нашел решение и могу опубликовать ответ. Позвольте мне прояснить: этот ответ никоим образом не принадлежит никому, кто ответил на этот пост. Я заранее заявил, что я новичок в 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()
В ваши жалобы было бы легче поверить, если бы ваш код не выглядел так же, как мой.
Вы знаете, как добавить обратный вызов на кнопку (которую я здесь не вижу) с помощью
command=? В этом случае нужно просто получить значения с помощьюvariables[xxx].get()и записать их, как любой другой файл. Здесь нет ничего волшебного.