В настоящее время я создаю графический интерфейс с использованием Tkinter в классе. Я хочу, чтобы графический интерфейс запрашивал у пользователя различные входы, основываясь на их предыдущем выборе. Кроме того, я отмечу, что я относительно новичок в python и, безусловно, Tkinter. Тем не менее, я сделал GUI в MATLAB раньше.Виджеты событий Tkinter
Итак, что я хочу сделать, это следующее:
- Запрашивать для скорости обработки, разделенных запятой. Затем пользователь будет вводить такие скорости, как: [90, 100, 102p5].
- Чтобы получить ввод от записи, вы должны нажать клавишу Enter, которая вызовет функцию, чтобы получить строку скоростей. Затем я беру строку, которая вводится и отделяет ее на основе запятых, чтобы сформировать список.
- Затем, после ввода скоростей, я хочу обновить графический интерфейс и показать секцию ввода для каждой скорости для ввода различных давлений с определенной скоростью, разделенных запятой. Давления будут в форме [100 кПа, 200 кПа, 300 кПа, 400 кПа].
- Для получения значений, вводимых для каждого давления, необходимо нажать enter в каждом окне ввода, как и раньше. Я снова формирую строку в список давлений.
Метод, который я имею дело, однако я не думаю, что это лучшая практика. Это ссылка, чтобы посмотреть, как выглядит графический интерфейс при вводе различных скоростей, как описано в шаге 1: GUI Image
В конце концов, к концу этого графического интерфейса я хочу иметь список скоростей и для каждой скорости список факторов давления. Затем я собираюсь взять эти списки и передать их другой функции для запуска программы, которую я ранее создал.
Следует отметить, что я не знаю, сколько скоростей пользователь захочет обработать. Я также не знаю, сколько дат будет введено для каждой скорости.
Итак, это мои вопросы: Будет ли это «питоническим» способом обработки событий с помощью Tkinter? Я ничего не нашел в Интернете о том, как показать новый виджет на основе завершения (нажав клавишу Enter) предыдущего.
Я также не уверен на 100%, если лучший способ передать переменные между различными методами - это сделать переменные атрибутом self. Например, как я передаю переменную «скоростей» и словарь «bp». Должен ли я использовать глобальные переменные? Это также усложняется, потому что я должен передавать переменные с событием, которое не позволяет добавлять дополнительные параметры.
Заранее благодарю вас за помощь! Если вы знаете хороший веб-сайт, который объясняет Tkinter более средним способом, который также был бы полезен!
from Tkinter import *
import tkMessageBox
class MyWindow(Frame):
def __init__(self, master):
self.speeds = []
Frame.__init__(self, master)
self.speed_widgets()
def speed_widgets(self):
label = Label(self.master, text="Enter the speeds you want to process, seperated by a comma:")
label = label.grid(row=0)
self.speeds_text = Entry(self.master)
self.speeds_text.grid(row=0, column=1)
self.speeds_text.bind('<Return>', self.get_speeds)
def get_speeds(self, event):
#global speeds
self.speeds = self.speeds_text.get()
if (not self.speeds):
tkMessageBox.showerror('Invalid Entry','Please enter at least one speed.')
else:
self.speeds = ''.join(self.speeds.split())
self.speeds = self.speeds.split(',')
num_speeds = len(self.speeds)
#print speeds
self.bp_widget()
def bp_widget(self):
keys = []
for speed in self.speeds:
keys.append(speed)
self.bp = dict.fromkeys(keys)
label = Label(self.master, text='Enter the back pressures for each speed, seperated by a comma:')
label = label.grid(row=1)
i = 2
self.bp_text_widgets = []
for speed in self.speeds:
label = Label(self.master, text=speed+'=')
label.grid(row=i, column=0)
self.bp_text_widgets.append(Entry(self.master))
self.bp_text_widgets[i-2].grid(row=i,column=1)
self.bp_text_widgets[i-2].bind('<Return>', lambda event, arg=i: self.get_bp(event, arg))
i += 1
def get_bp(self, event, i):
self.bp[self.speeds[i-2]] = self.bp_text_widgets[i-2].get()
print self.bp[self.speeds[i-2]]
root = Tk()
MyWindow(root)
root.mainloop()
Отличный сайт для tkinter: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html – saulspatz
Линия 'self.speed_widgets() def speed_widgets (self):' является ошибка синтаксиса. Пожалуйста, напишите рабочий код или, по крайней мере, код, который компилируется. – saulspatz
Спасибо за ссылку! Извините за проблему форматирования - это должно было произойти, когда я скопировал код из vi на этот сайт. Я все-таки исправился. – elmons13