버튼 클릭시 루프를 종료해야하는 PySide (Qt) GUI를 사용하고 있습니다. PySide에 대한 버튼 클릭은 신호를 내보내고 신호는 연결된 기능을 호출합니다. 그러나 신호가 함수를 호출하면 오류 처리를위한 자체 시스템을 사용합니다.파이썬에서 "with"문 (컨텍스트 관리자)을 수동으로 종료하는 방법이 있습니까
신호 오류 처리에 대한 수정을 정말로하고 싶지 않습니다.
오류가 발생하지 않고 "함께"문을 나눌 수있는 방법이 있습니까?
import sys
import time
from PySide import QtGui, QtCore
class MyClassError(Exception): pass
class MyClass(QtGui.QProgressDialog):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Properties
self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint)
self.setWindowModality(QtCore.Qt.WindowModal)
self.setMinimumDuration(2000) # if progress is finished in 2 sec it wont show
self.setRange(0, 99)
# end Constructor
def breakOut(self):
print("break out")
self.__exit__(MyClassError, "User cancel!", "") # does not break out of "with"
raise MyClassError("User cancel!") # PySide just prints Exception
# end breakOut
def __enter__(self):
self.canceled.connect(self.breakOut)
return self
# end enter (with)
def __exit__(self, etype, value, traceback):
# self.canceled.disconnect(self.breakOut)
if etype is None or etype == MyClassError:
return True
raise
# end exit
# end class MyClass
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
myinst = MyClass()
window.setCentralWidget(myinst)
val = 0
with myinst:
for i in range(100):
myinst.setLabelText(str(i))
myinst.setValue(i)
val = i+1
time.sleep(0.1)
# end with
print(val)
sys.exit(app.exec_())
신호에서의 PySide/Qt 오류 처리에서 보았던 수정 사항이 좋지 않습니다. 이 클래스를 사용하는 다른 사용자가 새 QApplication을 사용해야 함을 의미하는 QApplication을 대체합니다.
PySide/Qt 신호 오류 처리와 관련된 쉬운 방법이 있으며 "with"문을 벗어날 수있는 대안이 있습니다.
오해를 드려 죄송합니다. 그러나 샘플 코드는 진행되는 모든 것을 반영하지 않습니다. QProgressDialog의 setValue 메소드는 GUI 이벤트를 처리하므로 이벤트 루프가 호출되지 않아도 대기열의 이벤트 항목이 올바르게 처리되고 있습니다. 나는 스레딩에 대해 알고 있으며, 귀하의 의견에 감사드립니다. 당신은 나에게 몇 가지 좋은 통찰력을주었습니다. 나는 오류가 with의 코드 줄에서 직접적으로 발생한다면 오류가 단지'with' 문을 깨뜨린다는 것을 알았다. 내 접근법이 틀렸다는 것이 맞습니다. – HashSplat