2014-04-03 123 views
0

我的目標是提示用戶輸入特定內容的GUI窗口。我需要用戶打開公司徽標.jpg,測試設置的圖片和2個.csv數據文件。然後我希望他們輸入報告的名稱和一些測試設置。PyQt4 - 信號和插槽。將按鈕連接到方法時遇到問題

我最初的刺傷成功地生成了一個彈出式窗口,每個項目都有一個按鈕。由於我對每個按鈕有不同的要求,因此我決定返回並單獨執行每個信號/插槽組合。我希望能夠導入圖片和數據並將這些內容分配給變量名稱。不幸的是,在這個當前配置中,我得到的最接近的是它彈出一個窗口,在這個窗口中用戶需要選擇一個文件,然後用按鈕顯示另一個窗口....這不起作用。

import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtGui import * #yes, I know I did this above. 
from PyQt4.QtCore import * #However, when I only do the first one, I get errors. Same with the second way. 

class CompiledWindow(QtGui.QWidget): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self, parent) 

     def logo_pic(self): 
      global Logo_picture    
      Logo_picture = unicode(QFileDialog.getOpenFileName()) 

     self.setWindowTitle('Reasonably named window') 
     names = ['Open Logo Picture', 'Open Setup Picture', 'Open first data file', 'Open second data file', 'Enter text about settings', 'Enter other text about settings', 'Enter third setting', 'Enter fourth setting'] 
#this should give you an idea of how many items I need buttons for. I need to open 4 files and have the user enter several bits of text. 
     grid = QtGui.QGridLayout() 
     Logo_button = QtGui.QPushButton(names[0]) 
     self.connect(Logo_button, QtCore.SIGNAL('clicked()'), QtCore.SLOT(logo_pic(self)))   
     grid.addWidget(Logo_button, 0, 0)   
     self.setLayout(grid)  

app = QtGui.QApplication(sys.argv) 
cw = CompiledWindow() 
cw.show() 
sys.exit(app.exec_()) 

這裏是工作的修復: - 移動高清logo_pic出初始化 的 - 改變時隙/信號以 Logo_button = QtGui.QPushButton(名稱[0]) Logo_button.clicked。連接(self.logo_pic)

+0

嘗試'self.Logo_button.clicked.connect(self.logo_pic)'並使'logo_pic'成爲實例方法。應該在py3中工作,不知道py2。 – Hyperboreus

+0

什麼是實例方法?我使用2.7。 – mauve

+0

從'def __init__'中取出'def logo_pic(self)'並將它放在同一級別。 – Hyperboreus

回答

1

示例代碼存在幾個問題,這些問題在下面的重寫版本中都已得到修復。希望這應該有助於讓你開始正確的方向。

import sys 
from PyQt4 import QtGui, QtCore 

class CompiledWindow(QtGui.QWidget): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle('Reasonably named window') 
     names = ['Open Logo Picture', 'Open Setup Picture', 'Open first data file', 'Open second data file', 'Enter text about settings', 'Enter other text about settings', 'Enter third setting', 'Enter fourth setting'] 
     grid = QtGui.QGridLayout(self) 
     self.Logo_button = QtGui.QPushButton(names[0], self) 
     self.Logo_button.clicked.connect(self.logo_pic) 
     grid.addWidget(self.Logo_button, 0, 0) 

    def logo_pic(self): 
     self.Logo_picture = unicode(QtGui.QFileDialog.getOpenFileName()) 
     print(self.Logo_picture) 

app = QtGui.QApplication(sys.argv) 
cw = CompiledWindow() 
cw.show() 
sys.exit(app.exec_()) 
+0

順便說一句,最後一行應該是app.exec_(),至少對於Python 2.7 – mauve

+0

@mauve。不明白你的意思。這個例子對python-2.7來說非常好。你忘了導入'sys'模塊嗎? – ekhumoro

+0

我沒有。但我也得到這個奇怪的錯誤與其他導入....沒有添加「從PyQt4.QtGui導入*」,我得到一個未知的命令錯誤QLineEdit ....所以也許別的事情正在進行。 – mauve