2014-01-07 197 views
0

我在PyQt5中遇到了一个问题,如果我使用了一些函数,它会调用它,但是很多次我称它为止。我会尽力去解释相关的代码。调用函数并多次调用

class MainWindow(QtWidgets.QMainWindow, UI.MainUI.Ui_MainWindow): 
    """The Main Window where everything happens""" 
    def __init__(self, parent=None): 
     """Initializes (Don't use partial as most of the variables 
     aren't created yet)""" 
     super(MainWindow, self).__init__(parent) 
     self.setupUi(self) 
     self.btn_buy_ship.clicked.connect(
      lambda: self.game.current_player.buy_ship(self)) 

    def new_game(self): 
     """Runs tha actual Game""" 
     self.game = Game(self) 
     self.game.play(self) 

class Game(object): 
    """The Game Class""" 
    def __init__(self, window): 
     """The Obvious""" 
     self.window = window 
     self.makeshitgo = True 
     super(Game, self).__init__() 

    def play(self, window): 
     """starts the game""" 
     while self.makeshitgo: 
      for i in self.players: 
       self.current_player = i 
       if i.ship.name is None: 
        i.buy_ship(window) 
       while self.myturn: 
        QtWidgets.qApp.processEvents() 
        self.current_player.update_cargo(window) 
        time.sleep(.05) 
      self.turn += 1 

class Player: 
    def __init__(self, ship, port, name): 
     """Starts the player off with 0 everything and 5000 deblunes""" 
     self.name = name 

    def buy_ship(self, window): 
     """Stops execution until ok/cancel is pressed""" 
     window.change_ship("NA", "Galleon") 

     def purchase(): 
      """buys the ship and updates money""" # needs sell old ship 
      if self.money >= int(window.V_Price.text()): 
       self.ship = Ship(window.H_Ship_Name.text()) 
       self.change_money("down", self.ship.cost, window) 
       window.textBrowser.append(self.ship.name) 
       window.to_shipyard() 
      else: 
       window.textBrowser.append("You can't afford that brokearse") 

     def cancel_purchase(): 
      """If you don't want to make a purchase""" 
      if self.ship.name is None: 
       window.textBrowser.append("You need a ship") 
      else: 
       window.to_shipyard() 

     window.stackedWidget.setCurrentIndex(4) 
     window.btn_buy.clicked.connect(purchase) 
     window.btn_back_to_SY.clicked.connect(cancel_purchase) 

现在,每当我打电话i.buy_ship它的时候调用它然而多少次我把它叫做到目前为止(它调用的第一次,第二次我把它调用两次按钮等)。我感觉好像它必须在场(),但我不能为我的生活找到它。

编辑添加buy_ship功能的播放器类

+0

我们可以看到'buy_ship'函数吗?我认为它更可能是那个。 –

+0

它发生在buy_ship以上的功能,但肯定。 – Faller

回答

1

这可能是因为你绑定到按钮每次buy_ship被称为功能。所以第二次你叫buy_ship。以前的绑定仍然存在。

window.stackedWidget.setCurrentIndex(4) 
window.btn_buy.clicked.connect(purchase) 
window.btn_back_to_SY.clicked.connect(cancel_purchase) 
+0

是的,这是问题所在。要么只进行一次连接,要么使用适当的关键字来确保单个连接。 – amicitas

+0

我会试试看,你是什么意思“适当的关键字” – Faller

+0

精美的作品。感谢您通过M4rtini和amicitas上网。 – Faller