2015-10-05 2 views
1

В настоящее время я создаю графический интерфейс с использованием Tkinter в классе. Я хочу, чтобы графический интерфейс запрашивал у пользователя различные входы, основываясь на их предыдущем выборе. Кроме того, я отмечу, что я относительно новичок в python и, безусловно, Tkinter. Тем не менее, я сделал GUI в MATLAB раньше.Виджеты событий Tkinter

Итак, что я хочу сделать, это следующее:

  1. Запрашивать для скорости обработки, разделенных запятой. Затем пользователь будет вводить такие скорости, как: [90, 100, 102p5].
    • Чтобы получить ввод от записи, вы должны нажать клавишу Enter, которая вызовет функцию, чтобы получить строку скоростей. Затем я беру строку, которая вводится и отделяет ее на основе запятых, чтобы сформировать список.
  2. Затем, после ввода скоростей, я хочу обновить графический интерфейс и показать секцию ввода для каждой скорости для ввода различных давлений с определенной скоростью, разделенных запятой. Давления будут в форме [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() 
+0

Отличный сайт для tkinter: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html – saulspatz

+0

Линия 'self.speed_widgets() def speed_widgets (self):' является ошибка синтаксиса. Пожалуйста, напишите рабочий код или, по крайней мере, код, который компилируется. – saulspatz

+0

Спасибо за ссылку! Извините за проблему форматирования - это должно было произойти, когда я скопировал код из vi на этот сайт. Я все-таки исправился. – elmons13

ответ

0

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

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

Во-вторых, что произойдет, если я забуду нажать Enter после добавления обратного давления, или если я исправлю ошибку в обратном давлении, а затем забуду нажать Enter? Проблема в том, что я вижу только вход, и нет подтверждения того, что приложение действительно получил.

Это вопрос вкуса, возможно, но мне нравится делать всплывающее диалоговое окно ввода данных и, если возможно, эхо входные данные где-то в графическом интерфейсе. Итак, у меня была бы кнопка с надписью «Input Speeds», которая выведет диалог, в котором пользователь будет вводить скорости. Когда он щелкнет ОК, метка будет создана с текстом типа «Скорость 70 80 90». Рядом с ярлыком появится кнопка «Изменить», если использование изменится, или вы хотите ввести новую проблему.

Для каждой скорости я бы открыл диалоговое окно с инструкциями типа «Введите давление для скорости 80». Когда пользователь нажмет кнопку «ОК», появится метка с соответствующими данными и кнопка «Изменить».

Если я правильно понимаю вас, причина, по которой неиспользуемые записи торчат, заключается в том, что вы не знаете, как заставить их исчезнуть. Посмотрите на метод grid_forget. Например:

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-methods.html

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

EDIT: Что касается «наилучшего способа» для управления потоком, конечно, у меня нет ответа. Лично мне нравится, чтобы методы делали одно и возвращались. У меня была бы другая функция, отвечающая за вызов методов ввода данных в правильной последовательности. Таким образом, методы ввода данных являются разделяемыми. Я могу назвать их независимо, если пользователь понимает, что он что-то забыл и хочет вернуться. Возможно, это возможно и с вашей установкой, но взаимодействие мне не так понятно. Без сомнения, это во многом вопрос того, к чему я привык. Тем не менее, я считаю, что сделать вещи независимыми друг от друга, насколько это возможно, упрощает внесение изменений в будущем. Кроме того, я не знаю, сколько еще есть GUI. Если то, что вы показали, это почти все взаимодействие с пользователем, то я думаю, что у вас будет отлично работать.

+0

Большое вам спасибо за быстрый ответ. У меня все еще есть один вопрос. Я так называю один метод, а затем вызываю другой метод в конце первого, «лучший» способ делать то, что я хочу сделать? Например, я называю «speed_widgets», который затем вызывает «get_speeds», который затем вызывает «bp_widgets» на основе ввода последнего метода? Когда я делал GUI в MATLAB, я помню, что мог активировать другие виджеты, ранее дезактивированные, введя определенную информацию, определенную программистом. Мне нравится идея всплывающих окон, и метод grid_forget полезен. Еще раз спасибо! – elmons13

+0

Я отредактировал свой ответ, чтобы рассказать вам об этом. В основном это личное мнение. Я привык к привычкам, которые, похоже, работают хорошо для меня, но другим может не понравиться, как работает мой поток управления. Если ваш графический интерфейс делает то, что вы хотите, и он работает правильно, тогда я бы не стал слишком беспокоиться о том, является ли он «питоническим». Во всяком случае, это слово, похоже, мало что значит. Или, по крайней мере, это означает что-то другое для всех, кто его использует. – saulspatz

Смежные вопросы