Непреднамеренное закрытие окна программы при вызове функции в PyQt5
Начал я изучать PyQt5 недавно.
Добравшись до QPushButton, я начал экспериментировать с командами, которые выполняются после нажатия кнопки.
Я создал функцию, выводящую в консоль некий текст из списка. Причём, при повторном нажатии выводится следующий элемент списка.
jk=['Двач', 'Бред']
x=0
def function():
if x==0 or x==1:
print(jk[x])
x+=1
else:
pass
Далее создал кнопку, законнектил функцию с кнопкой.
button = QPushButton(parent=w, text ='BUTTON')
button.clicked.connect(function)
Запустил код, нажал на кнопку, окно зависло и закрылось.
В консоли не появились ошибки и какой-либо другой текст. Поэкспериментировав далее, я понял, что дело в x+=1. Убрав эту команду, программа работала как надо, только, конечно же, при повторном нажатии не выводился второй элемент списка.
Вот весь код:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
import sys
app = QApplication([])
w = QWidget()
w.setGeometry(0, 0, 500, 200)
jk=['Двач', 'Бред']
x=0
def function():
if x==0 or x==1:
print(jk[x])
x+=1
else:
pass
app.setStyle('Macintosh')
button = QPushButton(parent=w, text ='BUTTON')
button.clicked.connect(function)
button.move(250, 250)
button.resize(button.sizeHint())
w.show()
sys.exit(app.exec_())
У меня встал вопрос - как эта строка кода влияет на выполнение функции?
Ответы (1 шт):
Чтобы получить реальную ошибку - всегда запускайте свое приложение в CMD/консоле/терминале.
У вас ошибка:
if x==0 or x==1:
UnboundLocalError: local variable 'x' referenced before assignment
С учетом ООП ваша задача выглядит так:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, \
QGridLayout
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.jk = ['Двач', 'Бред']
self.x = 0
button = QPushButton('BUTTON')
button.clicked.connect(self.function)
layout = QGridLayout(self)
layout.addWidget(button)
def function(self):
if self.x == 0 or self.x == 1:
print(self.jk[self.x])
self.x += 1
else:
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.resize(600, 450)
w.show()
sys.exit(app.exec_())
Спросите если что-то не понятно.
