【问题标题】:PyQt - Create Menus With For Loops:PyQt - 使用 For 循环创建菜单:
【发布时间】:2017-08-12 22:34:06
【问题描述】:

我在表单中有一个分析数据的 CSV 文件

Continent:     CT:  Country:    Count:
North America  GT   Guatemala   1
...            ...  ...         ...

我想用来在我的 PyQT GUI 中创建一个“国家/地区”菜单,如下所示:

如您所见,我想先创建一个大陆菜单(可以忽略热门国家/地区),然后将国家/地区添加到每个大陆,因为它们出现在数据中。到目前为止,我有这段代码,它只加载一个空白的 GUI:

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
    MainWindow.setObjectName(_fromUtf8("Country-Wise Analytics"))
    MainWindow.resize(900, 700)

    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.menuPlatform = QtGui.QMenu(self.menubar)
    self.menuPlatform.setObjectName(_fromUtf8("menuPlatform"))
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtGui.QStatusBar(MainWindow)
    self.statusbar.setObjectName(_fromUtf8("statusbar"))
    MainWindow.setStatusBar(self.statusbar)

    cnts = []
    DIR = '/Users/jonathan/Documents/CountryWiseAnalytics/'
    with open(DIR + 'UsersPerCountry.csv', 'r') as UPC:
        UsersCountry = csv.DictReader(UPC, restval=None, restkey=None, dialect='excel')
        for row in UsersCountry:
            cnt = row['Continent:']
            if cnt not in cnts:
                cnts.append(cnt)
                self.menucnt = QtGui.QMenu(self.menuCountry)
                self.menucnt.setObjectName(_fromUtf8(cnt))

【问题讨论】:

  • ** 是在向我们展示吗?到目前为止,您没有添加任何菜单项或任何菜单。
  • 不,我已经删除了它们。这就是我问这个问题的原因 - 我需要更改什么才能使中间块添加菜单和最后一个块添加菜单项?

标签: python user-interface for-loop menu pyqt4


【解决方案1】:

我会将cnts 设为dict,而不是list ([])。

dict 将是从大陆名称到您通过self.menucnt.addMenu(cnt) 获得的QtGui.QMenu。 然后它会给你正确的 QMenu 来添加一个 QAction。

类似:

cnt_menu = cnts.setdefault(cnt, self.menucnt.addMenu(cnt))
cnt_menu.addAction(row['Country:'])

cfhttp://pyqt.sourceforge.net/Docs/PyQt4/qmenu.html

[编辑]

而且我不会通过直接调用构造函数来创建菜单和菜单项,而是使用 menuItem 容器中的 add* 方法,给它们我想看到的名称。 直接调用构造函数,只是设置内存管理链接,而不是包含链接。

参见http://doc.qt.io/qt-4.8/objecttrees.html

顺便问一下,你确定需要 setObjectName 吗?

【讨论】:

  • 'cnt_menu = ...' 行产生“unhashable type: 'dict'”错误。
  • 我的错,关键应该是cnt,而不是cnts(字典)。已更正。
  • 不再有错误但仍然没有菜单。显示菜单缺少什么?
  • 什么都没有?它,至少显示菜单栏吗?
  • 它显示了菜单栏,但大陆没有添加到国家菜单中。你能详细说明你的编辑吗?我不知道如何应用你所说的。
【解决方案2】:

工作答案:

Continents = {}
    CTs = {}
    popCT = ['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/'
    with open(DIR + 'UsersPerCountry.csv', 'r') as UPC:
        UsersCountry = csv.DictReader(UPC, restval=None, restkey=None, dialect='excel')
        for row in UsersCountry:
            Continent = row['Continent:']
            continentMenu = Continents.get(Continent, None)
            if continentMenu is None:
                continentMenu = self.menuCountry.addMenu(Continent)
                Continents[Continent] = continentMenu
            countryAction = continentMenu.addAction(row['Country:'])
            CT = row['Country:']
            if CT in popCT:
                self.actionCT = QtGui.QAction(self.menuPopular_Countries)
                self.actionCT.setObjectName(_fromUtf8(CT))
                CTMenu = CTs.setdefault(CT, self.menuPopular_Countries.addAction(CT))

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多