我有一个应用程序,应该在按下按钮后打开Web浏览器地址。主要功能如下:
class MainWindow(QtGui.QDialog):
def __init__( self, parent = None ):
super( MainWindow, self ).__init__( parent = parent )
self.button_layout = QtGui.QHBoxLayout(self)
self.webButton = PicButton(QtGui.QPixmap("images/button.png"))
self.filmButton.clicked.connect(openWebpage("http://some.web.adress"))
self.button_layout.addWidget(self.webButton)
打开网络浏览器的功能就是这样:
def openWebpage(address):
try:
import webbrowser
webbrowser.open(address)
except ImportError as exc:
sys.stderr.write("Error: failed to import settings module ({})".format(exc))
运行此代码后,没有可见的应用程序窗口,Web浏览器立即触发,控制台返回:
Failed to connect signal clicked().
连接到此按钮的简单功能正常工作(例如 - 将文本打印到控制台)。有什么想法吗?
答案 0 :(得分:0)
要在插槽中传递参数,您需要构造一个lambda表达式:
self.filmButton.clicked.connect(lambda: openWebpage("http://some.web.adress"))
为了解释这一点,connect()方法接受一个可调用对象作为其参数。 lambda表达式基本上是一个匿名函数,就是一个这样的可调用对象。您还可以在functools
模块的partial()
方法中包装函数调用以实现相同的功能。有关Python可调用内容的更多信息,请参阅What is a "callable" in Python?
答案 1 :(得分:0)
正如人们早些时候所说的那样 - 使用lambda,或者使用普通的slot
,这给了(至少对我来说)更多的可读性。
def __init__(self):
self.filmButton.clicked.connect(self._film_button_clicked)
@pyqtSlot() # note that this is not really necessary
def _film_button_clicked(self):
self.openWebpage('http://some.web.adress')