LINUX.ORG.RU

Как в питоне получить N значений из кутешного окна?

 ,


0

2

По ходу моего знакомства с фрикадом возник вопрос, как в скрипты передавать параметры из GUI. К сожалению, скрипты там на дурацком питоне, который я вообще не знаю.

Для получения N параметров я накатал такую штуку:

def getNparametersFromWindow(Labels, Title="Tell me more"):
	RET = 0
	Parameters = []
	def hide():
		RET = 1
		del Parameters[:]
		dialog.hide()
	def proceed():
		RET = 1
		dialog.hide()
	dialog = QtGui.QDialog()
#	dialog.resize(200,300)
	dialog.setWindowTitle(Title)
	la = QtGui.QVBoxLayout(dialog)
	lbl = []
	for i in range(0, len(Labels)):
		lbl.append(QtGui.QLabel(Labels[i]))
		la.addWidget(lbl[i])
		Parameters.append(QtGui.QLineEdit())
		la.addWidget(Parameters[i])
	okbox = QtGui.QDialogButtonBox(dialog)
	okbox.setOrientation(QtCore.Qt.Horizontal)
	okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
	la.addWidget(okbox)
	QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), proceed)
	QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), hide)
	QtCore.QMetaObject.connectSlotsByName(dialog)
	dialog.show()
	while (RET != 1):
		pass
	return Parameters
Однако, она подвисает - ничего не происходит.

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

☆☆☆☆☆

Ответ на: комментарий от shty

а для тех у кого баттхёрт по поводу слова switch можно написать класс из десятка строчек и будет как в такой родной и такой знакомой сищечке

shty ★★★★★
()
Ответ на: комментарий от fat_angel

Указатели в скриптовом языке? Да ты в конец упоролся

Это ты упоролся! А как передавать в функцию массив и менять его значения?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от shty

Чувак, в институте я отлично учился. Только какая связь может быть у астрофизика с говнопитоном?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от shty

Хрена с 2 это, а не switch!

Как сделать так:

switch (a){
    case 1:
        do_someth();
    case 2:
        do_more();
    break;
    case 3:
        do_three();
    default:
        do_four();
}
?

break'и здесь пропущены не случайно!

Вот такую конструкцию я хотел в питоне сделать. Но этот недоязык так не умеет. А когда у тебя с десяток проверок, как-то if'ами задолбаешься расписывать. Пришлось повторять куски кода.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А как передавать в функцию массив и менять его значения?

В пайтоне все предается по ссылкам

nkt@arnor ~ % python
Python 2.7.3 (default, Jun 16 2012, 11:07:05) 
[GCC 4.5.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> ar = ['a', 's', 'd', 'f']
>>> def f(v):
...   v[2] = 'ololo'
... 
>>> f(ar)
>>> ar
['a', 's', 'ololo', 'f']

fat_angel ★★★★★
()
Ответ на: комментарий от Eddy_Em

какая связь может быть у астрофизика с говнопитоном?

например, такая: http://www.astropython.org/

PS и если ты астрофизик-и-точка то не выставляй себя идиотом комментируя то в чём не разбираешься нифига

shty ★★★★★
()
Ответ на: комментарий от Eddy_Em

Как сделать так:

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

shty ★★★★★
()
Ответ на: комментарий от dmfd

что, в любом языке? даже там где исключения ничего не весят?

shty ★★★★★
()
Ответ на: комментарий от dmfd

Если уж начинать сажать на кол, то первыми должны идти те кто использует вложенные циклы и goto для выхода из них.

fat_angel ★★★★★
()
Ответ на: комментарий от fat_angel

Я вот о чем, как сделать на питоне так:

void f(type **x){
  f1(x[0]);
  f2(x[1]);
  f3(x[2]);
  f4(x[4]);
}
type a1, a2, a3, a4;
type *b[4] = [ &a1, &a2, &a3, &a4 ];
f(b);
…
?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от shty

Слушай, ты почитай хотя бы исходный пост темы!

Я сразу сказал: мне этот питон 7 лет не втарахтелся, но т.к. во фрикаде используется питон для скриптования, я задал вопрос: как сделать «формочку» на этом языке.

А тут сразу пошли метания говна…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от fat_angel

Все равно циклы в конечном итоге превращаются в набор goto… Так что, сажать на кол надо людей вроде тебя, твердящих, что goto не нужно!

А уж без вложенных циклах в обработке изображений вообще делать нечего!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от fat_angel

те кто использует вложенные циклы

А что за алгоритмы ты пишешь (на языках без оптимизации хвостовой рекурсии), что в них нет вложенных циклов?

и goto для выхода из них.

Честно говоря, давно не сталкивался с тем, чтобы это было нужно. Обычно можно без лишних вычислений засунуть это в условие выхода или обойти ещё как-то. Но catch/throw вместо goto - это просто сказочный говнокод. Заучили, что «goto это не кошерно», а мозг включать не умеют.

dmfd
()
Ответ на: комментарий от Eddy_Em

я задал вопрос: как сделать «формочку» на этом языке.

это типичный вопрос школьника-быдлокодера, поэтому теперь обтекай и не жалуйся

и да, я вообще не понимаю как можно задавая ламеркие вопросы одной рукой другой рукой с серьёзным видом рассуждать что там говно, а что нет

shty ★★★★★
()
Ответ на: комментарий от Eddy_Em

Все равно циклы в конечном итоге превращаются в набор goto…

ну так и пиши в машинных кодах, чего уж стесняться

shty ★★★★★
()
Ответ на: комментарий от fat_angel

Пример можно?

if( is_stupid(question) ||  is_asshole(author) || my_state==TIRED ) goto PENIS;


как же без этого?
AIv ★★★★★
()
Ответ на: комментарий от Eddy_Em

Так что, сажать на кол надо людей вроде тебя, твердящих, что goto не нужно!

Мы же с Вами вроде коллеги... так вот, goto ненужно!

AIv ★★★★★
()
Ответ на: комментарий от shty

и да, я вообще не понимаю как можно задавая ламеркие вопросы одной рукой другой рукой с серьёзным видом рассуждать что там говно, а что нет

Будто ты меня не знаешь. Это же моя «мирдверьмячная» натура ☺

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от shty

А я и не удивляюсь особо. ЛОР - он такой: из любого вопросика можно срач развести. А этот вопрос я бы удалил (все равно, толку 0 - надо либо забить, либо на сях попытаться сделать .so, которую из питона вытаскивать). Да не могу уже удалить.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Я вот о чем, как сделать на питоне так

def f(x) :
    f1(x[0])
    f2(x[1])
    f3(x[2])
    f4(x[4])

a1, a2, a3, a4 = type(), type(), type(), type()
b = [a1, a2, a3, a4]
f(b)

будет работать если type изменяемый тип (я так понимаю что f1-4 меняют свои аргументы).

Но питон - это не С, и не надо писать на нем как на С. Все таки питон гораздо изящней и лаконичней, привычка управлять бульдозером не повод жаловаться, что дескать у нормальной бэхи с автоматом вместо рычагов руль и странная ручка;-)
AIv ★★★★★
()
Ответ на: комментарий от Eddy_Em

«Если оно есть, значит, кому-то оно да нужно» ©

Насчет лиспа это еще справедливо... но не насчет goto.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Т.е. приравнивание b = [a1, a2, a3, a4] в этом случае не поместит в b копии?

Вот в том-то и проблема: слишком уж питон легкомысленный язык. Никакой строгой типизации… Как в нем что-то делать - не представляю…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от AIv

У меня goto активно используется в вычислителях внутри макроса: если выделение памяти или какая-то другая операция оканчивается неудачей, макрос дает переход на метку в конце функции, где запускаются деструкторы.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

на сях попытаться сделать .so, которую из питона вытаскивать

это можно, но не для форточек. Форточки рисуются на питоне гораздо проще чем на С. Попробуйте Tkinter... вот я тут че то писал http://a-iv.ru/pyart/myTkinter.pdf

Вот пример кода относящегося к форточке (это ВЕСЬ код к-й относится к форточке):

   if not dialog_tree( calc.path, calc, 
                        [( 'физические параметры', 
                           { '00':('температура T','.T',16), 
                             '01':('коэффициент диссипации gamma',
                                   '.gamma',16), 
                             '02':('постоянное внешнее поле Hext',
                                   '.Hext',4),
                             '03':('амплитуда переменного внешнего поля Aext',
                                   '.Aext',4),
                             '04':('частота  переменного внешнего поля Omega',
                                   '.Omega',16),
                             '05':('линейная анизотропия','.K2',16), 
                             '06':(' ось','.axe2',4),
                             '07':('кубическая анизотропия','.K4',16), 
                             '08':(' ось','.axe4',4)
                             } ),
                         ( 'начальные условия', 
                           { '00':('начальное значение','.init_value'),
                             '01':(1, '.init_method', ('дельта функция',0), 
                                   ('сферическое распределение',1), 
                                   ('распределение Больцмана',2), 
                                   ) }),
                                          
                         ( 'численные параметры', 
                           { '00':('шаг по времени h','.h'),
                             '01':('вывод каждые nsteps','.nsteps'), '11':'шагов',
                             '02':('время установления колебаний t_relax','.t_relax'),
                             '03':('время расчета Фурье-образа Delta_t','.Delta_t'),
                            '04':'общее число шагов в расчете %(steps_count)g',
                             '05':('подобрать параметры автоматически',mk_ht)
                             } ),
                         ( 'функции распределения', df_gui ) ] ) : sys.exit()
и скриншоты http://a-iv.ru/trash/spm-gui1.png http://a-iv.ru/trash/spm-gui2.png http://a-iv.ru/trash/spm-gui3.png http://a-iv.ru/trash/spm-gui4.png

AIv ★★★★★
()
Ответ на: комментарий от Eddy_Em

У меня goto активно используется в вычислителях внутри макроса

Ну Вы же знаете какие мы коды пишем?;-) И макросы кстати используются, и свой менеджмент памяти... но ни одного goto там нету.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Примеров формирования окон я уже 100500 видел. У меня проблема с тем, как передать полученные данные в другую функцию, вызывающую функцию, отрисовывающую эту «форточку».

Дело в том, что когда я во фрикаде вызываю окошко без ожидания ввода данных, окно сразу схлопывается и функция возвращает фигвам. Если жду - происходит зависание.

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

Но мне хочется упростить задачу, сделав общий модуль формирования графического ввода. Похоже, идея неудачная - но т.к. мне эти окна особо не нужны (из командной строки проще), я пока забил на это дело.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от AIv

Если не использовать goto, придется внедрять в функцию уйму if'ов, что сделает ее сильно запутанной. Мне проще с goto.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от AIv

«Если оно есть, значит, кому-то оно да нужно» ©

Насчет лиспа это еще справедливо... но не насчет goto.

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

dave ★★★★★
()
Ответ на: комментарий от AIv

так вот, goto ненужно!

Почему отцы ругали goto? Потому что большинство программистов - трудолюбивые обезьянки без абстрактного мышления. Подаёшь им подпрограммы - они их игнорируют, пишут всё в main, связывая всё в морской узел через goto. Подаёшь им продвинутый синтаксис для циклов - они ляпают if и goto. И всё катится в бездну уныния.

Об отвратительности goto говорили специально, чтобы приучить этот народ к более высокоуровневым конструкциям языка. Ведь программистам нужно создать догмы, религию, иначе они всё будут решать пчелиным трудолюбием. Нужно им внушить, что использовать goto не по-пацански, некошерно, Вирт не велел и т.д.

Но не всегда есть подходящие высокоуровневые конструкции. Пример - выход из вложенного цикла с с++. И вот тут-то goto уместно за неимением лучшего. Но у некоторых догмы полностью заменили собственный разум (так везде происходит, чего уж). И они лепят throw/catch, что гораздо уродливее и нелогичнее.

Так что любой может быть инструмент полезен, если знать применение всем остальным штуковинам из набора.

dmfd
()
Ответ на: комментарий от Eddy_Em

слишком уж питон легкомысленный язык. Никакой строгой типизации…

Вы не поверите... но разработчики считают Питон СТРОГО ТИПИЗИРОВАННЫМ ЯП. Я правда с ними не согласен, но это во первых ИМНО, во вторых терминологические споры совершенно бессымсленны (по определению;-)).

Примеров формирования окон я уже 100500 видел.

Таких лаконичных - вряд ли;-)

Дело в том, что когда я во фрикаде вызываю окошко без ожидания ввода данных, окно сразу схлопывается и функция возвращает фигвам. Если жду - происходит зависание.

А вот с этим конечно будут проблемы. Я тут не специалист, но наверное это будет зависеть от пакета в к-м происходит рисование. В Tkinter свои фенечки для разрулирования этого вопроса (тамошней цикл обработки событий нельзя запускать не в главном потоке, поэтому приходиться немного извращаться). Но это решается.

AIv ★★★★★
()
Ответ на: комментарий от Eddy_Em

Не смешите мои тапочки... во вложенном цикле основные затраты на внутр. цикле, и лишняя проверка флага во внешнем цикле вообще никакой роли не играет.

Кстати, скорость разработки на питоне как мин на порядок превышает скорость разработки на С/C++, это медицинский много раз проверенный факт.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Кстати, скорость разработки на питоне как мин на порядок превышает скорость разработки на С/C++, это медицинский много раз проверенный факт.

Зато работает оно на три порядка тормознутее!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Обычно на один-два порядка тормознутее. Но напр. для интерфейса скорость работы НЕ имеет значения.

Для числ моделирования обычно ядро (то что должно работать быстро, но меняется сравнительно редко) пишется на C/C++/Fortran/Pascal и т.д., а оболочка (интерфейс, верхний управляющий уровень и пр. - то, что может работать медленно а меняется постоянно) на питоне. В итоге скорость работы получается как на С, скорость разработки на порядок выше.

AIv ★★★★★
()
Ответ на: комментарий от AIv

интерфейс, верхний управляющий уровень

Нафига всё это в численной модели? У наших программ вообще интерфейса нет, ни gui, ни cli. Едят конфигурационный файлик, шуршат некоторое время и выплёвывают пачку других файлов. Никакой питон не нужен.

dmfd
()
Ответ на: комментарий от dmfd

Интерфейс это не обязательно форточки, и даже не обязательно опции командной строки. Интефейс это механизЪм взаимодействия чего то с чем то.

А куда именно ваши программы выкидывают пачку других файлов? А насколько развесистые возможно у вашего конфигурационного файла?

Нашим программам никакие конфигурационные не нужны. Есть ядро на С++ оформленное в виде библиотеки, подключаемой в питон. Есть головной файл на питоне в котором задаются все параметры, инициализируются массивы, вызывается последовательность функций обеспечивающая расчет, вывод диагностики и т.д. С-но этот файл и является конфигурационным в т.ч.

AIv ★★★★★
()
Ответ на: комментарий от AIv

А насколько развесистые возможно у вашего конфигурационного файла?

Выглядит как-то так: http://pastebin.com/xznSSXm5 (На самом деле там может быть несколько файлов, все лень копипастить.)

А куда именно ваши программы выкидывают пачку других файлов?

Создают папку в рабочей директории (откуда вызвали). Название папки состоит из даты и некой дополнительной информации.

dmfd
()
Ответ на: комментарий от AIv

вызывается последовательность функций обеспечивающая расчет

А у нас эдакий Unix-way. Одна программа считает одно, другая берёт выхлоп первой и считает второе, и т.д.

dmfd
()
Ответ на: комментарий от dmfd

Ну и нафига вводить еще один формат (конфига) если есть питон? Не говоря о том, что бывают весьма нетривиальные настройки. Все таки питон довольно мощный ЯП, и возможностей у него куда больше чем у любого конфига.

А у нас эдакий Unix-way. Одна программа считает одно, другая берёт выхлоп первой и считает второе, и т.д.

А склеивается это все скриптами шелла? Ну а мы склеиваем питоном, тоже unix-way.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.