Python Qmessagebox不工作
我正在使用Ubuntu linux。我使用了pyuic4命令,创建了一个.py文件,然后向其中添加了一个messagebox。它是:Python Qmessagebox不工作,python,pyqt,pyqt4,qmessagebox,Python,Pyqt,Pyqt4,Qmessagebox,我正在使用Ubuntu linux。我使用了pyuic4命令,创建了一个.py文件,然后向其中添加了一个messagebox。它是: from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_MainWindow(object): def setupUi(self, Ma
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(640, 480)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(190, 200, 98, 27))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 25))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.about)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def about(self):
QtGui.QMessageBox.about(self, "Test", "This is a test.")
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
经过多次试验,我发现如果我改变这一点,它会起作用:
class Ui\u主窗口(对象):
为此:
class Ui\u主窗口(QtGui.QMainWindow):
我做了一个大剧本,我不知道它是否会引起任何问题,或者我做的是否正确
事情,我只是糊涂了。如果我的写作有任何问题,请帮助我并原谅我。
这是我的第一篇文章。我不会以同样的方式使用pyuic4的结果。事实上,我根本不会使用pyuic4,但让我们看看可能性: 使用pyuic4 假设您有一个名为
MainWindow
的ui文件my\u window.ui
,您在其中创建了一个QMainWindow
小部件。使用Designer,您还添加了按钮的单击的操作与自定义插槽about()
(您知道如何在Designer中创建自定义插槽吗?)之间的链接。现在,可以通过两个步骤来使用ui文件:
使用pyuic4
生成python等效文件ui\u my\u window.py
:
$ pyuic4 my_window.ui -o ui_my_window.py
然后创建另一个python文件(main.py),该文件将导入文件ui\u my\u window.py
不要修改pyuic4生成的文件如果重新运行pyuic4
命令,它将被覆盖
$ cat main.py
from PyQt4 import QtGui
# import the class created py pyuic4
from ui_my_window import Ui_MainWindow
class MyMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None)
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# Beware that all widgets are now available through the self.ui attribute
# Getting the push button is written:
# self.ui.pushButton
def about(self):
# this is the custom slot created in Designer
QtGui.QMessageBox.about(self, "Test", "This is a test.")
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
myMainWindow = MyMainWindow()
myMainWindow.show()
sys.exit(app.exec_())
现在您有3个文件:
$ ls
main.py ui_my_window.py my_window.ui
只需运行python main.py
即可启动GUI
不使用pyuic4
PyQt4在处理ui文件时提供了一个非常有用的模块:。实际上,pyuic4正在使用这个模块生成ui文件的python文件。使用该模块可以避免pyuic4步骤(注意:如果在资源文件(.qrc)中使用图标,则仍然需要使用pyrcc4
工具并将结果文件导入代码中)
在您的示例中,代码变得非常简单:
$ cat main.py
import os
from PyQt4 import QtGui
# import the uic module
from PyQt4 import uic
class MyMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None)
QtGui.QMainWindow.__init__(self, parent)
# Load the ui file
uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)),"my_window.ui"), self)
# Now in this case, all widgets can directly be accessed because the last argument
# of loadUi is self.
# Getting the push button is written:
# self.pushButton
def about(self):
# this is the custom slot created in Designer
QtGui.QMessageBox.about(self, "Test", "This is a test.")
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
myMainWindow = MyMainWindow()
myMainWindow.show()
sys.exit(app.exec_())
在这种情况下,您只有2个文件:
$ ls
main.py my_window.ui
再次运行python main.py
来启动GUI。我不会以同样的方式使用pyuic4的结果。事实上,我根本不会使用pyuic4,但让我们看看可能性:
使用pyuic4
假设您有一个名为MainWindow
的ui文件my\u window.ui
,您在其中创建了一个QMainWindow
小部件。使用Designer,您还添加了按钮的单击的操作与自定义插槽about()
(您知道如何在Designer中创建自定义插槽吗?)之间的链接。现在,可以通过两个步骤来使用ui文件:
使用pyuic4
生成python等效文件ui\u my\u window.py
:
$ pyuic4 my_window.ui -o ui_my_window.py
然后创建另一个python文件(main.py),该文件将导入文件ui\u my\u window.py
不要修改pyuic4生成的文件如果重新运行pyuic4
命令,它将被覆盖
$ cat main.py
from PyQt4 import QtGui
# import the class created py pyuic4
from ui_my_window import Ui_MainWindow
class MyMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None)
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# Beware that all widgets are now available through the self.ui attribute
# Getting the push button is written:
# self.ui.pushButton
def about(self):
# this is the custom slot created in Designer
QtGui.QMessageBox.about(self, "Test", "This is a test.")
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
myMainWindow = MyMainWindow()
myMainWindow.show()
sys.exit(app.exec_())
现在您有3个文件:
$ ls
main.py ui_my_window.py my_window.ui
只需运行python main.py
即可启动GUI
不使用pyuic4
PyQt4在处理ui文件时提供了一个非常有用的模块:。实际上,pyuic4正在使用这个模块生成ui文件的python文件。使用该模块可以避免pyuic4步骤(注意:如果在资源文件(.qrc)中使用图标,则仍然需要使用pyrcc4
工具并将结果文件导入代码中)
在您的示例中,代码变得非常简单:
$ cat main.py
import os
from PyQt4 import QtGui
# import the uic module
from PyQt4 import uic
class MyMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None)
QtGui.QMainWindow.__init__(self, parent)
# Load the ui file
uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)),"my_window.ui"), self)
# Now in this case, all widgets can directly be accessed because the last argument
# of loadUi is self.
# Getting the push button is written:
# self.pushButton
def about(self):
# this is the custom slot created in Designer
QtGui.QMessageBox.about(self, "Test", "This is a test.")
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
myMainWindow = MyMainWindow()
myMainWindow.show()
sys.exit(app.exec_())
在这种情况下,您只有2个文件:
$ ls
main.py my_window.ui
再次运行python main.py
启动GUI。感谢您的精彩解释。实际上,我不是使用“pyuic4 my_window.ui-o ui_my_window.py”,而是使用这个命令:“pyuic4-x my_window.ui-o ui_my_window.py”。但问题是,当我需要使用这个“类MyMainWindow(对象):”这样我就可以方便地使用Qmessagebox时:“类MyMainWindow(QtGui.QMainWindow):”,如果我手动将“对象”替换为“QtGui.QMainWindow"? 我不知道如何在designer中创建自定义插槽。请告诉我。选项-x
会生成一个可执行的python脚本,但在我介绍的例子中,它将不起作用,因为关于的方法还不存在。要从designer中添加自定义插槽,请在主窗口中单击鼠标右键,然后选择“修改信号/插槽”或类似选项(抱歉,我的版本不是英文版本)。将出现一个窗口,允许您向主窗口小部件添加自定义信号和插槽。如果将信号连接到自定义插槽,不要忘记在继承的小部件中实现该插槽,就像我在示例Thank you Frodon中所做的那样。实际上,我首先制作了可执行的python脚本。然后我编辑脚本,添加必要的函数,并管理信号和插槽。这对我来说比较容易。我不必写太多的东西。通过使用第二种方法(没有pyuic4),您就没有太多的东西要写;)谢谢你的解释。实际上,我不是使用“pyuic4 my_window.ui-o ui_my_window.py”,而是使用这个命令:“pyuic4-x my_window.ui-o ui_my_window.py”。但问题是,当我需要使用这个“类MyMainWindow(对象):”这样我就可以方便地使用Qmessagebox时:“类MyMainWindow(QtGui.QMainWindow):”,如果我手动将“对象”替换为“QtGui.QMainWindow"? 我不知道如何在designer中创建自定义插槽。请告诉我。选项-x
会生成一个可执行的python脚本,但在我介绍的例子中,它将不起作用,因为关于的方法还不存在。要从designer中添加自定义插槽,请在主窗口中单击鼠标右键,然后选择“修改信号/插槽”或类似选项(抱歉,我的版本不是英文版本)。将出现一个窗口,允许您向主窗口小部件添加自定义信号和插槽。如果将信号连接到自定义插槽,不要忘记在继承的小部件中实现该插槽,就像我在示例Thank you Frodon中所做的那样。实际的