Форум сайта python.su
Помогите справиться с QSpinBox'ом !
Надо при нажатии на кнопку вытаскивать значение QSpinBox'a для дальнейших вычислений внутри другой функции (не относящийся к функции нажатия на кнопку) - но как только я пытаюсь вытащить числа из qspinbox'а - приложение крашится. Если хэштегами отрубить функцию получения значений из qspinbox'a и на вывод поставить просто
self.datelbltest.setText('value: ' + result)
import sys, datetime from PyQt5.QtWidgets import QWidget, QDesktopWidget, QMessageBox, QApplication, QCalendarWidget, QLabel, QSpinBox, QPushButton, QMainWindow from PyQt5.QtGui import QIcon, QFont from PyQt5.QtCore import QDate, Qt, pyqtSignal, QObject datenum = 0 result = 0 num_char = 0 num_expr = 0 num_fate = 0 num_bscyear = 0 num_fnyear = 0 num_expryear = 0 summ_bday = 0 summ_bdmonth = 0 summ_bdyear = 0 summ_ftyear = 0 summ_ftyearlast = 0 class Communicate(QObject): closeApp = pyqtSignal() class mainframe(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): global datenum self.c = Communicate() self.c.closeApp.connect(self.close) btnExit = QPushButton("Выход", self) btnExit.move(20, 480) btnExit.resize(120,40) btnExit.setFont(QFont("Times New Roman", 14, QFont.Bold)) btnExit.clicked.connect(self.exitEvent) self.datelbl1 = QLabel(self) self.datelbl1.setText("Дата рождения") self.datelbl1.move(95, 15) self.datelbl1.setFont(QFont("Times New Roman", 12, QFont.Bold)) self.datelbl1.adjustSize() self.datelbl2 = QLabel(self) self.datelbl2.setText("Год прогноза") self.datelbl2.move(292, 15) self.datelbl2.setFont(QFont("Times New Roman", 12, QFont.Bold)) self.datelbl2.adjustSize() self.datelbltest = QLabel(self) self.datelbltest.setText("date test") self.datelbltest.move(20, 300) self.datelbltest.adjustSize() cal = QCalendarWidget(self) cal.setGridVisible(False) cal.move(20, 40) cal.setVerticalHeaderFormat(0) cal.clicked[QDate].connect(self.showDate) self.lbl = QLabel(self) date = cal.selectedDate() self.lbl.setText(date.toString(Qt.ISODate)) self.lbl.move(110, 230) qsb = QSpinBox(self) qsb.move(300, 40) qsb.resize(75,25) qsb.setAlignment(Qt.AlignCenter) qsb.setMinimum(1900) qsb.setMaximum(2100) qsb.setFont(QFont("Times New Roman", 14, QFont.Bold)) btn1 = QPushButton("Рассчитать матрицу", self) btn1.move(18, 255) btn1.resize(360,40) btn1.setFont(QFont("Times New Roman", 14, QFont.Bold)) btn1.clicked.connect(self.setupmatrix) self.setFixedSize(960, 540) self.center() self.setWindowIcon(QIcon('icon.png')) self.setWindowTitle('|Event Matrix|PC edition|') datenum = date.toString(Qt.ISODate) self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def closeEvent(self, event): reply = QMessageBox.question(self, 'Выход из приложения', "Вы уверены, что хотите выйти?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def showDate(self, date): global datenum self.lbl.setText(date.toString(Qt.ISODate)) datenum = date.toString(Qt.ISODate) def setupmatrix(self): global summ_ftyearlast global result mainframe.calculate(self) self.datelbltest.setText('value: ' + summ_ftyearlast) self.datelbltest.adjustSize() def exitEvent(self, event): self.c.closeApp.emit() @staticmethod def calculate(self): global result global datenum global num_char global num_expr global num_fate global summ_ftyear global summ_ftyearlast num0 = int(datenum[0]) num1 = int(datenum[1]) num2 = int(datenum[2]) num3 = int(datenum[3]) result = str(num0+num1+num2+num3) if len(result) >= 2: resnum1 = int(result[0]) resnum2 = int(result[1]) result = str(resnum1+resnum2) ftyeartext = self.qsb.value() last1 = int(ftyeartext[2]) last2 = int(ftyeartext[3]) summ_ftyearlast = str(last1+last2) if __name__ == '__main__': app = QApplication(sys.argv) ex = mainframe() sys.exit(app.exec_())
Офлайн
DarkNocturneqsb = QSpinBox(self)
self.qsb = QSpinBox(self)
Офлайн
py.user.nextНе помоглоself.qsb = QSpinBox(self)
self.qsb = QSpinBox(self) self.qsb.move(300, 40) self.qsb.resize(75,25) self.qsb.setAlignment(Qt.AlignCenter) self.qsb.setMinimum(1900) self.qsb.setMaximum(2100) self.qsb.setFont(QFont("Times New Roman", 14, QFont.Bold))
Отредактировано DarkNocturne (Авг. 30, 2018 08:17:49)
Офлайн
Все, нашел как решить проблему (пришлось добавить костыль)
Тут припаял еще глобальную переменную от спинбокса
@staticmethod def calculate(self): global result global datenum global spinbox global num_char global num_expr global num_fate global summ_ftyear global summ_ftyearlast num0 = int(datenum[0]) num1 = int(datenum[1]) num2 = int(datenum[2]) num3 = int(datenum[3]) result = str(num0+num1+num2+num3) if len(result) >= 2: resnum1 = int(result[0]) resnum2 = int(result[1]) result = str(resnum1+resnum2) last1 = int(spinbox[2]) last2 = int(spinbox[3]) summ_ftyearlast = str(last1+last2)
self.qsb = QSpinBox(self) self.qsb.move(300, 40) self.qsb.resize(75,25) self.qsb.setAlignment(Qt.AlignCenter) self.qsb.setMinimum(1900) self.qsb.setMaximum(2100) self.qsb.setFont(QFont("Times New Roman", 14, QFont.Bold)) self.qsb.valueChanged.connect(self.spinboxChanged)
def spinboxChanged(self): global spinbox spinbox = str(self.qsb.value())
Отредактировано DarkNocturne (Авг. 30, 2018 09:44:44)
Офлайн
Глобальных переменных не должно быть вообще в программе. Используй return или аргумент в виде списка, в который добавляются результаты.
И ты ещё не понимаешь, что такое @staticmethod, этот декоратор тебе вообще не нужен.
Отредактировано py.user.next (Авг. 30, 2018 10:33:11)
Офлайн
py.user.next
Глобальных переменных не должно быть вообще в программе. Используй return или аргумент в виде списка, в который добавляются результаты.И ты ещё не понимаешь, что такое @staticmethod, этот декоратор тебе вообще не нужен.
Офлайн
DarkNocturneОни вредят программе. Вопрос глупый, даже школьники знают, почему глобальные переменные не используются. Глобальная переменная может быть изменена из любого места в программе, поэтому ты в любом месте программы не знаешь, какое именно значение находится в глобальной переменной в данный момент.
Чем тебе глобальные переменные не угодили?
DarkNocturneПрограмма будет расти в размере и ты не сможешь всегда помнить, где и какая переменная меняется. Потом просто всё будет сводиться к работе с фрагментом программы и все влияния на все переменные фрагмента должны будут находиться под рукой. А с глобальными переменными ты даже не можешь сказать, какая часть программы запишет в них значения последней. Программу надо делить на части и части эти изолировать друг от друга, соединяя через тонкие, определённые в одном месте каналы (аргументы функций и возвращаемые значения функций). Таким образом каждая часть становится независимой от остальной программы и ты можешь её отлаживать отдельно как маленький кусок. При этом все изменения в маленьком куске программы никак не влияют на остальные части программы.
Через return я хз как работать еще, так что пока и так сойдет…
DarkNocturneДекоратор нужно убрать, а вместо глобальных переменных использовать атрибуты из self. Когда используешь этот декоратор, то нужно self убирать, потому что такой метод (статический) используется без участия экземпляра.
а декоратор этот нужен, чтобы функцию нормально вызывать откуда угодно
>>> class A: ... @staticmethod ... def f(): ... return 1 ... >>> A.f() 1 >>>
Отредактировано py.user.next (Авг. 30, 2018 14:01:47)
Офлайн
py.user.nextЯ буквально пару дней сижу на питоне и еще мало чего понимаю - разбраться с ним мне помогает яндекс (гугль неудобный для меня), а цель непростая - нужно сделать программу, которая будет проводить математические вычисления на основе различных дат (суммы чисел года, месяца, дня и т.д и т.п), но вот пока что застрял на уровне интерфейса и взаимодействия элементов
Они вредят программе. Вопрос глупый, даже школьники знают, почему глобальные переменные не используются. Глобальная переменная может быть изменена из любого места в программе, поэтому ты в любом месте программы не знаешь, какое именно значение находится в глобальной переменной в данный момент.
py.user.next
Программа будет расти в размере и ты не сможешь всегда помнить, где и какая переменная меняется. Потом просто всё будет сводиться к работе с фрагментом программы и все влияния на все переменные фрагмента должны будут находиться под рукой. А с глобальными переменными ты даже не можешь сказать, какая часть программы запишет в них значения последней. Программу надо делить на части и части эти изолировать друг от друга, соединяя через тонкие, определённые в одном месте каналы (аргументы функций и возвращаемые значения функций). Таким образом каждая часть становится независимой от остальной программы и ты можешь её отлаживать отдельно как маленький кусок. При этом все изменения в маленьком куске программы никак не влияют на остальные части программы.
py.user.next
Декоратор нужно убрать, а вместо глобальных переменных использовать атрибуты из self. Когда используешь этот декоратор, то нужно self убирать, потому что такой метод (статический) используется без участия экземпляра.
Отредактировано DarkNocturne (Авг. 30, 2018 14:26:25)
Офлайн
DarkNocturneПитон - это один из языков программирования. Но программирование имеет собственную теорию, не связанную ни с одним языком. И вот в этой теории есть определённый опыт, накопившийся со временем. Многие программисты делали многие программы (тысячи программистов и тысячи программ) и пришли к одному и тому же выводу насчёт глобальных переменных. В литературе по питону тебе про это писать не будут, так как это и так известно из общей теории программирования. Поэтому ты можешь и не узнать этих вещей, пока фокусируешься только на питоне и литературе по нему.
Я буквально пару дней сижу на питоне и еще мало чего понимаю
DarkNocturneGoogle и Yandex - это разные системы, имеющие свои плюсы и минусы. Yandex хорошо ищет русскоязычное и сортирует результаты поиска по популярности (часто популярность материалов эквивалентна качеству), в то время как Google имеет средства для более точного поиска, когда ты уже точно знаешь, что нужно найти. Поисковый язык Google позволяет искать по кускам ссылок, по заголовкам внутри страниц по типам файлов.
разбраться с ним мне помогает яндекс (гугль неудобный для меня)
!gt dog
!w dog
!wolfram sin(pi/2)
!pip crypto
!pep 20
md5 text
ascii code cheat sheet
DarkNocturneИнтерфейс программы и содержимое программы - это независимые части программы. Один интерфейс можно подключать к разному содержимому, а одно содержимое можно подключать к разным интерфейсам. Поэтому надо писать заранее изолированно. Как в компьютере - все детали изолированы друг от друга, поэтому ты можешь комп купить в одном магазине, жёсткий диск к нему купить в другом магазине, а кулер купить в третьем магазине. И всё будет работать, когда соединишь, как будто в одном магазине купил всё.
но вот пока что застрял на уровне интерфейса и взаимодействия элементов
DarkNocturneКогда она вырастет или даже не вырастет, а поменяется десять раз, ты на себе ощутишь влияние глобальных переменных, но уже будет поздно что-то менять, так как вся программа будет пронизана этими глобальными переменными. Когда тебе в сотый раз нужно будет полностью перечитывать одну и ту же программу и многие места перечитывать, которые ты уже перечитывал, ты поймёшь, что время утекло и на разработку ничего не осталось. Поэтому, соблюдая правила, ты экономишь собственное время в будущем. А когда ты уже нормально программируешь, то программу на 10000 строк ты уже физически не сможешь перечитывать, потому что только на прочтение будет уходить неделя, если не больше. И у тебя всё время будет всплывать вопрос в голове “зачем я это снова читаю? я же уже читал это десять раз”. Так будет происходить после каждого малейшего изменения в программе - где-то баг обнаружился и его надо исправить, где-то фича срочно понадобилась и её надо быстро добавить. Это неизбежные вещи, про которые ты пока что не в курсе.
Ну программа не будет расти в размере
DarkNocturneДостаточно иметь две похожие программы, чтобы начать забывать, что и где было в первой программе. Даже в пределах одной программы можно словить такой эффект. Достаточно, чтобы у неё было две-три версии (старая, поновее и самая новая). Как только нарушишь обратную совместимость - удалишь то, что было в программе, как ненужное, - так сразу начнутся вопросы к этим различиям и глобальным переменным, с ними связанным. То есть тебе надо будет их и держать в одной версии, и удалять их из другой версии. И всё это надо будет держать в голове одновременно.
и поэтому не думаю, что я запутаюсь или не смогу отследить переменные
DarkNocturneДа, можно и просто перейти на другое задание, чтобы забыть содержимое того задания, которое делал до этого, дня за три.
P.S. также воюю с QCalendarWidget, чтобы достать оттуда значения дня недели
Отредактировано py.user.next (Авг. 31, 2018 04:11:03)
Офлайн
py.user.next
Так что изучай правила общепринятые, соблюдай их без вопросов. Когда придёт время, ты будешь благодарен, что тебе посоветовали начать с них, а не терять время на набивание глупых шишек.
Офлайн