更新从for循环读取dict生成的QLineEdit文本框中的文本

时间:2019-02-07 07:11:04

标签: python-3.x pyqt5 pyside2

我有2个使用for循环生成的QLineEdit框,它们从字典中提取名称和初始文本值。我拥有的代码可以很好地更新字典值,并且可以正确生成编辑框。我遇到的问题实际上是更新gui上的值以供用户查看。我在Windows 10专业版上使用pyside2和python 3.7.2。

如果我对QLineEdit框进行“硬编码”,则可以使用self.display1.setText("asdf")正常工作。我生成输入的方式除了更新分配给编辑框文本的字典值外,无法确定该怎么做。我尝试在单击按钮时以及在修改字典中的值之后调用update()repaint()。我还尝试通过调用重新构造输入并完成.addWidget()的函数来重新定义小部件。正如预期的那样,这在已生成的编辑框下生成了新的。但是,框中的文本是正确的。

这是生成输入的循环

for val, key in self.inputDict.items():
    self.inputs = QLineEdit(key, self)
    self.inputs.setText(key)
    self.vertCol.addWidget(self.inputs)

相关字典:self.inputDict = {"display1": "", "display2": ""}

这是生成按钮的循环(之所以处于循环中,是因为这只是我正在构建的该程序的1个功能,其他按钮滚动了不同的侧面模具)

for key, val in self.buttonDict.items():
    self.buttons = QPushButton(key, self)
    self.buttons.setToolTip("D20 die rolled: 1-10=low, 11-20=high; Coin Flip: 0=Heads(Good) 1=Tails(Bad)")
    self.buttons.clicked.connect(partial(self.handlehlgb))
    self.vertCol.addWidget(self.buttons)

相关按钮字典self.buttonDict = {"High-Low-Good-Bad": "hlgb"}

这是我要开始使用的功能:

    def handlehlgb(self):
        self.coinFlip = randrange(2)
        self.rollD20 = randint(1, 20)
        if self.coinFlip <= 0:
            self.inputDict.update({'display1': 'Good'})
            print(self.inputDict["display1"])
        else:
            self.inputDict.update({'display2': 'Bad'})
            print(self.inputDict["display2"])
        if self.rollD20 <= 10:
            self.inputDict.update({'display2': 'Low'})
            print(self.inputDict["display2"])
        else:
            self.inputDict.update({'display2': 'High'})
            print(self.inputDict["display2"])

它的意思是根据D20骰子显示“硬币翻转”和“高/低”确定的好/差。

我希望它能更新GUI上的显示,但不会。它将在控制台中显示正确的显示值。这是我正在使用的粘贴框:https://pastebin.com/H6LAnbnH

我是python的新手,尤其是pyside / pyqt。因此,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我可能有一个误解,但似乎如果您在掷骰子后简单地添加一个setText:

self.inputDict.update({'display1': 'Good'})
self.inputs.setText(self.inputDict["display2"])

在QLineEdit中更新文本。

然后您可能希望将self.inputs用作字典,以便可以更改两个QLineEdits:

self.inputs = {}
for val, key in self.inputDict.items():
    self.inputs[key] = QLineEdit(key, self)

...

self.inputDict.update({'display1': 'Good'})
self.inputs['display1'].setText(self.inputDict['display1'])

(等一下...现在,我复制粘贴您的代码,当您可能希望将其写为val,key in ...时,我看到您写了key,val in ...)。可能就是这样吗?

[编辑] 这是两种想法的结果:

class MainWidget(QWidget):
    def __init__(self):
        super(MainWidget, self).__init__()
        self.buttonDict = {"High-Low-Good-Bad": "hlgb"}
        self.inputDict = {"display1": "", "display2": ""}
        self.vertCol = QVBoxLayout(self)

        self.inputs = {}
        for key, val in self.inputDict.items():
            self.inputs[key] = QLineEdit(key, self)
            self.inputs[key].setText(val)
            print("Key - " + key)
            print("Val - " + val)
            self.vertCol.addWidget(self.inputs[key])

        for key, val in self.buttonDict.items():
            self.buttons = QPushButton(key, self)
            self.buttons.setToolTip("D20 die rolled: 1-10=low, 11-20=high; Coin Flip: 0=Heads(Good) 1=Tails(Bad)")
            self.buttons.clicked.connect(partial(self.handlehlgb))
            #self.buttons.clicked.connect(self.inputs.update())
            self.vertCol.addWidget(self.buttons)

    def handlehlgb(self):
        self.coinFlip = randrange(2)
        self.rollD20 = randint(1, 20)
        if self.coinFlip <= 0:
            self.inputDict.update({'display1': 'Good'})
            self.inputs['display1'].setText('Good')
            print(self.inputDict["display1"])
        else:
            self.inputDict.update({'display2': 'Bad'})
            self.inputs['display1'].setText('Bad')
            print(self.inputDict["display2"])
        if self.rollD20 <= 10:
            self.inputDict.update({'display2': 'Low'})
            self.inputs['display2'].setText('Low')
            print(self.inputDict["display2"])
        else:
            self.inputDict.update({'display2': 'High'})
            self.inputs['display2'].setText('High')
            print(self.inputDict["display2"])