【问题标题】:PyQt5: Add Variable Number of Rows to Layout Based on Python DictionaryPyQt5:基于 Python 字典向布局添加可变行数
【发布时间】:2018-06-16 20:53:11
【问题描述】:

对不起,如果问题有点含糊! 我是使用 PyQt 的新手(通常是制作 GUI),我正在制作一个脚本,用于检测我计算机上已安装的程序并检索程序的名称及其可执行文件路径。到目前为止,我有一个字典,其中文件名作为键,相应的文件路径作为键值。

这是一个 sn-p,虽然实际的字典要长得多:

{'Nexus Mod Manager': 'C:\\Games\\Nexus Mod Manager\\NexusClient.exe',
'CCleaner': 'E:\\Program Files\\CCleaner\\CCleaner.exe'}

我的目标是为字典中的每个键值对创建一个有一行的 GUI。我还想在每一行中放置 2 个按钮(是和否),让用户选择文件路径是否正确。如果正确,它将执行一些其他功能。

问题是字典没有固定的长度。在我的计算机上,大约有 53 个密钥,但对于另一台计算机,或者如果我以后安装或卸载程序,这个数字可能会有很大的不同。

我更喜欢 PyQt,因为这是我最了解创建 GUI 的模块,但我也对其他方法持开放态度。

谢谢!

【问题讨论】:

  • 这归结为如何迭代 Python 字典,这应该很容易在网络上找到有关信息。或者还有别的什么?也许,如果您有更具体的问题,提取最少的示例代码会很有用。

标签: python file dictionary layout pyqt


【解决方案1】:

这可以使用 Qt 的模型/视图架构来实现。 Heres a link to a tutorial from Qt,它是用 c++ 编写的,但它应该会有所帮助。

基本上,您要做的是子类化 QAbstractTableModel,然后重写 data 方法以根据您的数据结构(在本例中为字典)在每列中显示您需要的信息。

下面使用了第二个字典键列表,以便可以使用索引来确定正在填充的行。

    self.data_dict = {}
    self.row_display_list = [x for x in self.data_dict.keys()] # Assumes the dict is not empty

def data(self, index, role=QtCore.Qt.DisplayRole):
    if role == QtCore.Qt.DisplayRole:
        if index.column() == 0:
            return self.row_display_list[index.row()]
        elif index.column() == 1:
            return self.data_dict[self.row_display_list[index.row()]]

对于不同的数据结构有几种不同的实现方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多