2015-09-21 3 views
0

Я пишу программу, которая читает и изменяет двоичный файл, который содержит информацию о некоторых изображениях: но чтобы иметь возможность сделать это, ему нужны и некоторые сведения от пользователя, скажем, где расположены эти изображения и несколько вариантов.Как создать легкий графический интерфейс с TkInter

С быстрым исследованием в Интернете я обнаружил, что простым способом создания графических интерфейсов является Tkinter, и на самом деле я быстро достиг своей цели. В частности, я использовал модули без необходимости вызова функции mainloop, создавая и уничтожая окно всякий раз, когда я хотел показать что-то на экране: мое приложение, так как таким образом я смог покинуть программу, как это было до необходимости «поговорить» с пользователем, без необходимости реорганизовать ее с чисто объективно-ориентированной структурой, как в случае «реального» GUI.

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

Так вот вопрос : существует ли стратегия общения с пользователем без необходимости включать все ваши функции в класс GUI и без использования бесконечного цикла? (Я думаю, что ответ НЕТ с использованием Tkinter) Каков наилучший подход в этой гибридной ситуации?

+1

работает бесконечный "цикл событий", в основном, как GUI приложения работать после того, как он выходит приложение закрывается. Таким образом, вы не можете избежать mainloop, и нет смысла пытаться. – AcidReign

+0

Посмотрите здесь: http://stackoverflow.com/questions/7782425/tkinter-and-gui-programming-methods?rq=1 –

+0

@AcidReign: Не обязательно.В Windows, например, вы, безусловно, можете выполнять некоторые не-пользовательские интерфейсы, представлять окно и запускать цикл сообщений, позволять контуру сообщения завершаться и выполнять больше не-пользовательского интерфейса, а затем представлять другое окно и запускать еще один цикл сообщений ... В Windows , часто модальные диалоги реализуются также через вложенные петли сообщений, поэтому, по вашему мнению, они действительно не так вырезаны и сухие. – icktoofay

ответ

1

Я собрал скелет. Несколько замечаний:

  1. Это простой случай с тремя функциями, которые принимают 1 или 2 аргумента. Однако приспосабливать его к большему количеству функций и аргументов следует избегать.
  2. Я определенно не защищаю короткие имена переменных в реальных программах.
  3. Рассмотрите возможность использования классов а) в base.py, если это соответствует вашей логике б) в GUI.py, как только он становится немного
  4. Используйте grid необязательные аргументы, чтобы иметь хороший вид графического интерфейса.

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

Комментарии приветствуются.

Первый модуль:

#file base.py 
def f1(input1): 
    ... 
    return res1 

def f2(res1, input2): 
    ... 
    return res2 

def f3(res2): 
    ... 
    return res3 

if __name__ == '__main__': 
    r1 = f1('directoryPath') 
    r2 = f2(r1, 'fileName') 
    r3 = f3(r2) 

Второй модуль:

#file commandline.py 
from base import * 

i1 = input() # in 3.X, raw_input in 2.X 
r1 = f1(i1) 

i2 = input() # in 3.X, raw_input in 2.X 
r2 = f2(r1, i2) 
r3 = f3(r2) 

Третий модуль:

#file GUI.py 
from base import * 
import tkinter as tk # in 3.X, Tkinter in 2.X 

def compute(): 
    i1 = e1.get() 
    r1 = f1(i1) 

    i2 = e2.get() 
    r2 = f2(r1, i2) 
    r3 = f3(r2) 

    l1.configure(text = r3) #if r3 is a string else str(r3) 

app = tk.Tk() 
e1 = tk.Entry(app) 
e1.grid() 

e2 = tk.Entry(app) 
e2.grid() 

b1 = tk.Button(app, text = "Compute", command = compute) 
b1.grid() 

l1 = tk.Label(app) 
l1.grid() 

app.mainloop() 
+0

Спасибо Эрик за ваш ответ! Я думаю, что мне не хватает ключевого момента: как первый модуль может запустить графический интерфейс (или часть командной строки)? Кажется, что первый из них является «основным», но я не понимаю, что является логикой других, поскольку они не содержат только класс или функции, но также некоторые отдельные инструкции. В любом случае, спасибо за ваше время и объяснение! – giubacchio

+0

@giubacchio: первый модуль не может запускать другие. Он может содержать почти весь код, но вы используете один из других для запуска версии командной строки или версии GUI. Вы также можете поместить весь код в один модуль, особенно если вы всегда хотите запустить версию графического интерфейса. –

+0

То, что я искал, - это возможность иметь основную структуру как один из ваших первых модулей, с возможностью вызова модуля, такого как GUI.py, возможно, также несколько раз, чтобы запросить информацию у пользователя , Я не знаю, возможно ли это, потому что таким образом будет иметь место (но не одновременно) более чем один mainloop, и это, как правило, не допускается. Способ достижения моей цели состоит в том, чтобы поместить все основные вычисления в функцию, называемую графическим интерфейсом (скажем, с помощью кнопки запуска), и спросить пользователя, когда мне нужна информация. Но мне так не нравится это решение! – giubacchio

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