2017-04-03 24 views
0

以下是我的部分分析GUI的代码。当点击菜单中的国家时,应制作与该国不同的菜单。然而,目前,无论哪个国家被压制,最后一个国家将成为制作菜单的国家(在这种情况下,点击任一个国家将产生荷兰菜单)。为什么是这样?PyQt - 仅生成最终值的操作

import csv 
import math 
import itertools 
import numpy as np 
from PyQt4 import QtCore, QtGui 
import matplotlib.pyplot as plt 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(QtGui.QMainWindow): 

    def countryAction(self): 

     window = QtGui.QMainWindow(self) 
     window.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     window.setWindowTitle(self.tr(country)) 
     window.show() 

    def setupUi(self, MainWindow): 
     MainWindow.setGeometry(50, 50, 500, 300) 
     MainWindow.setWindowTitle('uAnalytics') 
     MainWindow.setWindowIcon(QtGui.QIcon('uTalkLogo.png')) 

     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 867, 22)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     self.menuCountry = QtGui.QMenu(self.menubar) 
     self.menuCountry.setObjectName(_fromUtf8("menuCountry")) 
     self.menuPopular_Countries = QtGui.QMenu(self.menuCountry) 
     self.menuPopular_Countries.setObjectName(_fromUtf8("menuPopular_Countries")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.actionAll_Countries = QtGui.QAction(MainWindow) 
     self.actionAll_Countries.setObjectName(_fromUtf8("actionAll_Countries")) 
     self.menuCountry.addAction(self.actionAll_Countries) 
     self.menuCountry.addSeparator() 
     self.menuCountry.addAction(self.menuPopular_Countries.menuAction()) 

     continents = {} 
     countries = {} 
     popularcountries = ['United States', 'United Kingdom', 'South Africa', 'Germany', 'India', 'Australia', 'Canada', 'Italy', 'Sweden' ,\ 
    'Netherlands', 'France', 'New Zealand', 'Belgium', 'Switzerland', 'Norway', 'Brazil', 'Indonesia', 'Russia', \ 
    'United Arab Emirates', 'Spain', 'Denmark'] 
     DIR = '/Users/jonathan/Documents/CountryWiseAnalytics/' 
     UsersCountry = {('Europe', 'NL', 'Netherlands'): 231, ('Europe', 'GB', 'United Kingdom'): 2636} 
     for key, value in UsersCountry.iteritems(): 
      continent = key[0] 
      continentMenu = continents.get(continent) 
      if continentMenu is None: 
       continentMenu = self.menuCountry.addMenu(continent) 
       continents[continent] = continentMenu 
      country = key[2] 
      CT = key[1] 
      countryAction = QtGui.QAction(QtGui.QIcon(CT.lower() + '.png'), country, MainWindow) 
      countryAction.setStatusTip('uAnalyse ' + country) 
      countryAction.triggered.connect(lambda: self.countryAction(country)) 
      if country in popularcountries: 
       print(CT.lower() + '.png') 
       self.menuPopular_Countries.addAction(countryAction) 
      else: 
       continentMenu.addAction(countryAction) 

     self.menubar.addAction(self.menuCountry.menuAction()) 
     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.menuCountry.setTitle(_translate("MainWindow", "Country", None)) 
     self.menuPopular_Countries.setTitle(_translate("MainWindow", "Popular Countries", None)) 
     self.actionAll_Countries.setText(_translate("MainWindow", "All Countries", None)) 


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_()) 

在这段代码中没有太多解释。该错误可能在以continents = {}开头的块中的某处,因为这是countryAction定义的位置。

回答

1

您可能需要使用的部分,而不是拉姆达

from functools import partial 
countryAction.triggered.connect(partial(self.countryAction, country)) 
+0

谢谢,这很有用。你能解释它背后的逻辑吗?这与lambda的效果有什么关系,只是在被点击时调用函数,因此总是触发最后一个countryAction? –

0

您的代码似乎适用于我。我在CentOS-7上的x86_64的:

jkelly @ CentOS的:〜$转-qi PyQt4的 版本:4.10.1 发布:13.el7

+0

它运行,但你没有得到名为 '英国' 你是否点击该窗口荷兰还是英国? –

+1

你是对的。如果我使用一个函数来返回lambda,它的工作原理。

 def cfunc(self, country): return lambda x: self.countryAction(country) ... countryAction.triggered.connect(self.cfunc(country)) 

+0

还必须将国家作为参数添加到self.countryAction –

1

可以使用sender()函数返回生成信号,在这种情况下QAction对象,让我们用函数text()的名字,为他们作出如下改变。

变化

countryAction.triggered.connect(lambda: self.countryAction()) 

countryAction.triggered.connect(self.countryAction) 

而且


def countryAction(self): 
    window = QtGui.QMainWindow(self) 
    window.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
    window.setWindowTitle(self.tr(self.sender().text())) 
    window.show()