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



我有两个使用for循环生成的QLineEdit框,它们从字典中提取名称和初始文本值。我的代码很好地更新了字典值,并且正确地生成了编辑框。我遇到的问题实际上是更新gui上的值以供用户查看。我在windows 10 pro上使用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": ""}

这是生成按钮的循环(它在一个循环中,因为这只是我正在构建的这个程序的一个功能,其他按钮滚动不同的侧面模具)

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)

相关按钮dictself.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。因此,任何帮助都将不胜感激!!

我可能误解了,但如果你只是在掷骰子后添加一个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"])

最新更新