如何使用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()?的主要内容,如果未能解决你的问题,请参考以下文章

从批处理文件运行python脚本时,如何自动将输入值传递给python“输入”函数

PyQt5:如何将变量传递给类?

将相同输入类型的多个值传递给 BigQuery 表值函数

pyqt5 继承python类可以传递信号函数吗

如何将可观察值传递给@Input() Angular 4

为啥输入的值没有传递给 VUEX