Хранить переменные, введенные в форме tkinter - PullRequest
1 голос
/ 20 февраля 2020

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

from tkinter import *
import pandas as pd

fields = ('Event', 'Event Folder', 'Session', 'Date: (MM/DD/YYYY)', 'StartTime: 24HR(HH:MM)', 'EndTime: 24HR(HH:MM)')

def saveVars(entries):
    locals().update(entries)
    return 

def makeform(root, fields):
   entries = {}
   for field in fields:
      row = Frame(root)
      lab = Label(row, width=22, text=field+": ", anchor='w')
      ent = Entry(row)
      ent.insert(0,"")
      row.pack(side = TOP, fill = X, padx = 5 , pady = 5)
      lab.pack(side = LEFT)
      ent.pack(side = RIGHT, expand = YES, fill = X)
      entries[field] = ent
   return entries

if __name__ == '__main__':
   root = Tk()
   ents = makeform(root, fields)
   b1 = Button(root, text = 'Enter', command = lambda e = ents: saveVars(e))
   b1.pack(side = LEFT, padx = 5, pady = 5)
   root.mainloop()

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

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

import tkinter as tk

fields = ('Event', 'Event Folder', 'Session', 'Date: (MM/DD/YYYY)',
          'StartTime: 24HR(HH:MM)', 'EndTime: 24HR(HH:MM)')


def do_something_with_entries():
    for ndex, entry in enumerate(entry_list):
        print(fields[ndex], ': ', entry.get())


if __name__ == '__main__':
    root = tk.Tk()
    entry_list = []
    for field in fields:
        row = tk.Frame(root)
        lab = tk.Label(row, width=22, text=field + ": ", anchor='w')
        ent = tk.Entry(row)
        entry_list.append(ent)
        row.pack(side='top', fill='x', padx=5, pady=5)
        lab.pack(side='left')
        ent.pack(side='right', expand='yes', fill='x')

    tk.Button(root, text='Enter', command=do_something_with_entries).pack(side='left', padx=5, pady=5)
    root.mainloop()

Результаты:

enter image description here

Вот пример использования pandas:

import tkinter as tk
import pandas as pd


fields = ['Event', 'Event Folder', 'Session', 'Date: (MM/DD/YYYY)', 'StartTime: 24HR(HH:MM)', 'EndTime: 24HR(HH:MM)']
df = pd.DataFrame(columns=fields)


def do_something_with_entries():
    global df
    stored_values = []
    for ndex, entry in enumerate(entry_list):
        stored_values.append(entry.get())

    series = pd.Series(stored_values, index=fields)
    df = df.append(series, ignore_index=True)


if __name__ == '__main__':
    root = tk.Tk()
    entry_list = []
    for field in fields:
        row = tk.Frame(root)
        lab = tk.Label(row, width=22, text=field + ": ", anchor='w')
        ent = tk.Entry(row)
        entry_list.append(ent)
        row.pack(side='top', fill='x', padx=5, pady=5)
        lab.pack(side='left')
        ent.pack(side='right', expand='yes', fill='x')

    tk.Button(root, text='Enter', command=do_something_with_entries).pack(side='left', padx=5, pady=5)
    root.mainloop()
0 голосов
/ 20 февраля 2020

Вы сохраняете вопросы как ключи, а виджеты ввода - как значения диктанта entries.

Во-первых, уберите диктант entries из функции makeform (в противном случае его может использовать только функция makeform)
Во-вторых, создайте диктат answer. Мы собираемся хранить ответы здесь.
В-третьих, создайте функцию fetch, которая будет вызываться, когда пользователь нажимает кнопку Enter. Он будет go через entries dict и устанавливать значения answers dict для введенных ответов (используя Entry.get(...) метод)
Теперь вы можете обрабатывать ответы формы.

Здесь Вот пример:

from tkinter import *
import pandas as pd



fields = ('Event', 'Event Folder', 'Session', 'Date: (MM/DD/YYYY)',
    'StartTime: 24HR(HH:MM)', 'EndTime: 24HR(HH:MM)')
entries = {}
answers = {}

def makeform(root, fields):
   for field in fields:
      row = Frame(root)
      lab = Label(row, width=22, text=field + ": ", anchor='w')
      ent = Entry(row)
      row.pack(side=TOP, fill=X, padx=5, pady=5)
      lab.pack(side=LEFT)
      ent.pack(side=RIGHT, expand=YES, fill=X)
      entries[field] = ent
   return entries

def fetch():
   for question in entries:
      answers[question] = entries[question].get()
   print(answers) # do something with the results now

if __name__ == '__main__':
   root = Tk()
   ents = makeform(root, fields)
   root.bind('<Return>', fetch)
   b1 = Button(root, text='Enter', command=fetch)
   b1.pack(side=LEFT, padx=5, pady=5)
   root.mainloop()

PS: Вам не нужно использовать lambda -функцию в качестве команды кнопки. Просто используйте функцию извлечения в качестве команды.
PS 1: А почему вы звоните ent.insert(0, "")? Это не имеет никакого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...