2016-08-12 5 views
0

обновление для моего кода, на основе ответа Израиля Unterman:питон 3.4, настройка QWidgets.QMessageBox

Ошибка класса теперь

from PyQt5 import QtWidgets 
from PyQt5.QtWidgets import QMainWindow 

class Error(QtWidgets.QMainWindow): 
    reply = False 
    last_reply_id = None 
    last_id = 0 

    def __init__(self, error_code_string, parent=None): 
     super().__init__(parent) 
     QtWidgets.QMessageBox.warning(self, "Warnung", error_code_string, QtWidgets.QMessageBox.Ok) 
     id = give_id(self) 

    def give_id(self): 
     self.last_id += 1 
     return self.last_id 

    def give_reply(self): 
     if last_id == last_reply_id: 
      return self.reply 
     else: 
      return None 

    def set_reply(self, button, id): 
     if button in (QMessageBox.Ok, QMessageBox.Yes): 
      reply = True 
     else: 
      reply = False 
     self.last_reply_id = id 
     return reply 

И Test-Script поставляется с

from ErrorHandling import Error 

Error('Test') 

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

id = give_id(self) 

Кодекс останавливается без ErrorMessage из питона, просто:

Process finished with exit code 1 

Если я использую тест-скрипт, нет ничего (нет QMessageBox!), Чем это:

Process finished with exit code 1 

Если Я отладки кода, инициализации() получает одни и те же объекты и переменные, но

super().__init__(parent) 

не работает без каких-либо сообщений. Итак, где ошибка, или разница.

Здесь shortend Версия класса (это слишком долго, чтобы показать весь код здесь), из которого «Error» работает почти нормально:

from ErrorHandling import Error 
class MainWindow(QWidget): 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     # set some variables 
     self.create_layout() 

    def create_layout(self): 
     # creates a GUI using QWidgets with some Inputboxes and one button 

[...]  

    def button_start_clicked(self): 
     Error('Check the input') 

Вот старый вопрос:

I есть проблема с настройкой QtWidgets.QMessageBox. Весь код следует за описанием.

ОшибкаHandling-Modul должна содержать сообщение об ошибке. При необходимости он также может задать вопрос. Функция ErrorMsg.errorMessage вызывается из других модулей в случае исключения. Будет добавлено больше функций.

Если я запускаю код следующее сообщение об ошибке:

Connected to pydev debugger (build 145.1504) 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.1.4\helpers\pydev\pydevd.py", line 1531, in <module> 
    globals = debugger.run(setup['file'], None, None, is_module) 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.1.4\helpers\pydev\pydevd.py", line 938, in run 
    pydev_imports.execfile(file, globals, locals) # execute the script 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.1.4\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile 
    exec(compile(contents+"\n", file, 'exec'), glob, loc) 
    File "C:/Quellcode/AllgTest.py", line 5, in <module> 
    reply = errm.errorMessage('Test') 
    File "C:/Quellcode\ErrorHandling.py", line 20, in errorMessage 
    msg_box.setIcon(QMessageBox.Warning) 
    TypeError: QMessageBox.setIcon(QMessageBox.Icon): first argument of unbound method must have type 'QMessageBox' 

Process finished with exit code 1 

Я попытался довольно некоторые вариации и гугле, но я понятия не имею, что эта проблема является, так как я нашел несколько примеров, которые используют линии QMessageBox .setIcon (QMessageBox.Icon) Итак, где моя ошибка?

И теперь код:

Существует следующая testscript, чтобы проверить мой ErrorMsg класса

from ErrorHandling import ErrorMsg 
errm = ErrorMsg() 
reply = errm.errorMessage('Test') 

А вот мой ErrorHandling-Modul

from PyQt5.QtWidgets import QMessageBox 
from PyQt5.QtWidgets import QMainWindow 

class ErrorMsg(QMainWindow): 
    def __init__(self): 
     pass 

    def giveback(self,button): 
     if button in (QMessageBox.Ok, QMessageBox.Yes): 
      reply = True 
     else: 
      reply = False 
     return reply 

    def errorMessage(self, error_msg, buttons='OK'): 
     msg_box = QMessageBox 
     msg_box.setIcon(QMessageBox.Warning) 
     msg_box.setWindowTitle('Warning') 
     if buttons == 'OK': 
      msg_box.setStandardButtons(QMessageBox.Ok) 
     elif buttons == 'YesNo': 
      msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No) 
     else: 
      error_msg = 'Unknown Button >' + buttons + '<, use >OK<or>YesNo<' 
      raise ValueError(error_msg) 
     msg_box.setText(error_msg) 
     clicked_button = msg_box.exec() 
     return giveback(clicked_button) 

Спасибо за вашу помощь

James

ответ

0

Вы не создали объект окна сообщения. Для того, чтобы создать использование объекта:

msg_box = QMessageBox() 

Но don'y нужно пройти через все это, так как QMessageBox имеет статические функции для отображения сообщений, которые вы можете позвонить непосредственно на QMessageBox класса. Например:

QMessageBox.warning(None, 'title', 'msg') 

Вы также имеете некоторый контроль над butons см QMessageBox

+0

Правильно, но он также должен использовать 'self' при вызове' giveback' метод;) –

+0

@Israel Unterman I нужны функции, потому что в будущем развитии необходимо знать, какая кнопка была нажата, поэтому мне нужно вернуть значение. –