如何使用pyqt5将输入值传递给input()?
Posted
技术标签:
【中文标题】如何使用pyqt5将输入值传递给input()?【英文标题】:How to pass input value to input() using pyqt5? 【发布时间】:2020-06-04 01:51:22 【问题描述】:我创建了一个扑克游戏,其中的主要功能将要求玩家(用户)在控制台中输入一个动作(跟注/弃牌等)。主函数会调用玩家的 action() 函数(代码如下),该函数有两行 input() 要求用户输入动作类型和下注大小:
玩家的 action() 函数将在轮到他的时候一直被调用,但整个游戏将暂停,等待将值传递给下面的 input()。
def action(self, chipsToCall : int, thisGameActions : dict):
"""
Position based strategy, Fixed range
"""
nChip = self._getCurrentStack(thisGameActions)
community_card = []
community_card = thisGameActions['CommunityCards']['Flop'] + thisGameActions['CommunityCards']['Turn'] + thisGameActions['CommunityCards']['River']
print("\n***************************")
print('current street ', thisGameActions['Street'], ' your position ', self.position)
print('your hand ', str(self.hand[0]), str(self.hand[1]))
print('your stack ', str(nChip))
print('bet to call ', str(chipsToCall))
print('current pot', str())
print('community cards ', thisGameActions['Pot'])
for i in community_card:
#print(i.prettyCard())
print(i)
print('current Street Bet History')
print(thisGameActions['BetHistory'])
action = input("type in your action: ")
bet = int(input("type in your bet (int): "))
print("\n***************************")
return action, bet
我的问题是,我如何创建一个 pyqt5 小部件以将值从按钮(例如)传递到上面的 input() 函数?
现在,我的 gui 代码将通过调用 main 函数来运行游戏,但它仍会在控制台中要求输入。
更新:
我意识到我的语言可能令人困惑,下面是我编写的这款扑克游戏的完整源代码。
https://github.com/TerryDuan/PokerGame
test.py 显示了游戏将如何执行的示例,当其中一个玩家是 interactivePlayer 时,控制台将要求用户在每个游戏(以及每个“街道”)中输入动作和下注大小.
例如:
import os
import sys
sys.path.append("..")
from deckClass import Deck
from playerClass import Player
from smarterPlayer import smarterPlayer
from interactivePlayer import interactivePlayer
from PokerTableClass import table
if __name__ == "__main__":
print("TEST TEST TEST")
p1 = Player("p1")
p2 = Player("p2")
p3 = Player("p3")
p4 = Player("p4")
p5 = interactivePlayer("ip5")
p6 = smarterPlayer("sp6")
aTable = table()
aTable.setMaxGames(1000)
aTable.addPlayer(p1,100)
aTable.addPlayer(p2,100)
aTable.addPlayer(p3,100)
aTable.addPlayer(p4,100)
aTable.addPlayer(p5,100)
aTable.addPlayer(p6,100)
print("Table Setted up with Six dummy player")
print("Number of Players " + str(aTable.getNPlayer()))
print("Number of Active Players " + str(aTable.getNPlayer_active()))
print("Number of inGame Players " + str(aTable.getNPlayer_inGame()))
aTable.runGame()
以上代码将启动一个完整的扑克游戏(最多 1000 次迭代),用户只能在 python 控制台上“玩”它。
我的目标是在其上构建一个 gui,以取代 python 控制台。 我试图找到是否有办法覆盖 input() 函数,以便它等待来自 UI 窗口的值。 但到目前为止,我没有找到任何可以帮助我的文章/帖子。
更新 2
作为一个简化的例子: 最初,我有以下代码不断要求用户输入命令
class player():
...
def action(self):
action = input("please type in a command: ")
return action
p1 = player()
while True:
action = p1.action()
if action == 'exit':
break #end of the game
这里用户只能在 python 控制台上“玩”它 如何使用 pyqt5 构建一个带有按钮的 UI(对应于 diff 类型的操作)来运行这个游戏,而不是在 python 控制台上
【问题讨论】:
请提供minimal reproducible example 【参考方案1】:您需要创建一个小部件(比如说窗口),其中包含每个操作一个按钮,或一个用于键入您的操作的输入字段。如果你考虑第二个选择,它会是这样的:
from PyQt5.Widgets import QLabel, QDialog, QPushButton
class InputWindow(QDialog):
pokerActions = ["Action_1",.....,"Action_n"]
def __init__(self, parent=None)
super().__init__()
self.setUI()
def setUI(self):
lblAction = QLabel("Type your Action")
self.lineAction = QLineEdit()
self.lineAction.editingFinished.connect(self.sendAction)
layout = QHBoxLayout()
layout.addWidget(lblAction)
layout.addWidget(self.lineAction)
self.setLayout(layout)
@pyqtSlot()
def sendAction(self):
if self.lineAction.text() not in pockeActions:
return
parent.getAction(self.lineAction.text()
您将需要从调用类中打开这个小部件,可能是在每个玩家按以下方式进行调用时:
act = InputWindow(self)
act.show()
act.exec()
您可能希望通过以下方式替换您的操作方法:
def getAction(action):
return action
【讨论】:
以上是关于如何使用pyqt5将输入值传递给input()?的主要内容,如果未能解决你的问题,请参考以下文章