Уведомления

Группа в Telegram: @pythonsu

#1 Май 15, 2019 07:58:12

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

Всем привет!
Py 2.7, PyQT4

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

 class MyModalWinconfig(QtGui.QWidget):
    def __init__(self,parent, flag,  *args, **kwargs):
        QtGui.QWidget.__init__(self, parent, flag, *args, **kwargs)
        self.setWindowFlags(flag|QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowTitleHint|QtCore.Qt.FramelessWindowHint|QtCore.Qt.WindowCloseButtonHint)
        self.setWindowModality(QtCore.Qt.WindowModal)
        layout = QtGui.QVBoxLayout(self)
        #layout.setAlignment(QtCore.Qt.AlignCenter)
        self.setLayout(layout)
        
        global var_Tmin, var_Tmax

Самое простое решение, на мой взгляд, однако ни как не получается расставить все ровно (делается сверху вниз)
        self.label_Tmin = QtGui.QLabel(u'T', self)
self.label_Tmin.setGeometry(0, 0, 30, 10)
self.label_Tmin.setStyleSheet(QString("font-size: %2px").arg(14))
self.label_Tmin.setText(u'T: '+str(var_Tmin))
layout.addWidget(self.label_Tmin)

self.button1 = QtGui.QPushButton(u"+", clicked=self.plus)
self.button1.setGeometry(10, 10, 80, 20)
layout.addWidget(self.button1)

self.button2 = QtGui.QPushButton(u"-", clicked=self.minus)
self.button2.setGeometry(10, 10, 80, 20)
layout.addWidget(self.button2)

А если несколько переменных, то вообще ерунда получается.

Прошу подсказать, каким образом можно сделать изменение переменной? оптимально что бы можно было вводить значение (цифры), можно + и -, но по разрядам (сотни, десятки, единицы) ?

Офлайн

#2 Май 15, 2019 09:22:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

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

p.s.
Очевидно global var_Tmin, var_Tmax не имеет ни малейшего смысла в ините. Они не используются там, да наверное и не должны.



Отредактировано doza_and (Май 15, 2019 09:27:02)

Офлайн

#3 Май 15, 2019 09:27:24

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

Контролы выравнить получилось

         self.label_inf_Tmin = QtGui.QLabel(u'asd', self)
        self.label_inf_Tmin.setGeometry(0, 0, 30, 10)
        self.label_inf_Tmin.setStyleSheet(QString("font-size: %2px").arg(14))
        self.label_inf_Tmin.setText(u'Tмин: '+str(var_Tmin))        
        layout.addWidget(self.label_inf_Tmin,1,1)
        
        self.button1 = QtGui.QPushButton(u"-", clicked=self.set_T_min_minus)
        self.button1.setGeometry(0, 10, 80, 20)
        self.button1.show
        layout.addWidget(self.button1,1,2)
        
        self.button2 = QtGui.QPushButton(u"+", clicked=self.set_T_min_plus)
        self.button2.setGeometry(10, 10, 80, 20)
        layout.addWidget(self.button2,1,3)
        
        self.button3 = QtGui.QPushButton(u"Выход", self)
        self.button3.clicked.connect(self.deleteLater) 
        self.button3.setGeometry(10, 40, 80, 20)
        layout.addWidget(self.button3,3,4)
        
        
    def set_T_min_plus(self, comand):
        global var_Tmin
        var_Tmin=var_Tmin+1
        self.deleteLater
    def set_T_min_minus(self, comand):
        global var_Tmin
        var_Tmin=var_Tmin-1
        self.deleteLater

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

Офлайн

#4 Май 15, 2019 09:30:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

lefmails
Но для этого придется для каждой переменной делать.
Так что именно делать?

Вы напишите яснее тип будет 10 переменных не хочу повторять функции f1,f2, …

Честное слово непонятно в чем проблема.

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



Отредактировано doza_and (Май 15, 2019 09:39:50)

Офлайн

#5 Май 15, 2019 09:45:17

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

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

Офлайн

#6 Май 15, 2019 10:11:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

doza_and
Список глобальных переменных он хочет получить и построить на основании этого списка набор контролов, которые будут изменять переменные.

lefmails
Не могу сдержаться, извините.
Ху…ню вы пытаетесь сделать, дорогой товарищ.
Никогда не используйте неконстантные глобальные переменные без острой на то необходимости (а её у вас нет, я гарантирую)

процитирую товарища со стековерфло (ссылка не работает)

Глобальные переменные в большинстве случаев нарушают инкапсуляцию. К ним открыт неконтролируемый доступ отовсюду.

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

Глобальные переменные в большинстве случаев нарушают принцип инверсии зависимостей (или делают возможным его нарушение).

Глобальные переменные ухудшают масштабируемость проекта.

Глобальные переменные ухудшают читаемость кода (в каком-то конкретно взятом месте непонятно, нужна ли какая-то конкретная глобальная переменная, или нет).

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

Глобальные переменные создают большие сложности при использовании модульного тестирования.

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

Вы работаете с объектно-ориентированным кодом. Эта парадигма была придумана в том числе, чтобы исключить недостатки плоского неструктурированного кода, когда все сущности объявляются в глобальной области видимости (глобальные переменные, функции, структуры и тд.). Использовать ООП вместе с глобальными переменными, это как греть на плите электрический утюг или впрягать автомабиль как телегу в тройку лошадей.
Сделайте отдельный класс Settings с полями соответствующими вашим переменным, инстанциируйте объект и передавайте этот объект в ваше модальное окно. У объекта будет свойство obj.__dict__, там найдете все свои переменные.



Отредактировано FishHook (Май 15, 2019 10:13:45)

Офлайн

#7 Май 15, 2019 10:35:42

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

Прошу подсказать про кнопку и передачи в нее функции

  btn_arh.clicked.connect(self.show_modal_save_var('22'))
    def show_modal_save_var(self,vare):
        window3 = MyModalWinsave_var(self, QtCore.Qt.Dialog)
        window3.setWindowTitle(u"Изменение переменной")
        window3.setGeometry(0, 0, 480, 272)
        window3.set_text(u'Переменная')        
        window3.set_locvars(u'Tmin:'+str(vare))
        window3.show()
Почему то зависает модальное окно
Когда убераешь значение btn_arh.clicked.connect(self.show_modal_save_var()
Соответственно в другом окне выводи False

Офлайн

#8 Май 15, 2019 11:19:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

lefmails

найдите в интернете и внимательно прочитайте, что такое callback. Зачем нужен, как используется. Потом рекомендую крепко подумать, что вообще делает метод connect, а после совместить полученные знания.



Офлайн

#9 Май 15, 2019 11:59:25

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение глобальное переменной в модальном окне

Спасибо, сделал в таком формате:
Кнопка вызывает функцию через коннект, а в этой функции вызывается с передающим параметром.

как уж получилось, главное работает)))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version