Jest to kwestia ciekawości. Mam blok kodu, który wykonuje zaakceptowany.Connect (). Wyrzuca ten błąd, ale kiedy sprawdzam wyniki, które wciąż działają. A od tego, co rozumiem z pudełka przycisków: Po naciśnięciu OK lub Anuluj, okno dialogowe powinno się zamknąć. Nawet zainicjowałem samodzielnie. Kiedy naciskam ok, choć okno pozostaje otwarte i podaje następujący błąd:

TypeError: accept() missing 2 required positional arguments: 'player' and 'window'

Oto jakiś kod:

class UIinit(QtGui.QDialog, UI.Buy_Cargo.Ui_Dialog):
        """The Dialog for initiation"""
        def __init__(self, player, window):
            super(UIinit, self).__init__()
            self.window = window
            self.player = player
            self.setupUi(self)
            #for i in Config.port_prices:
            #   up = getattr(self, "btn_" + i + "_up")
            #    up.clicked.connect(partial(self.up, i, player))
            #    down = getattr(self, "btn_" + i + "_down")
            #    down.clicked.connect(partial(self.down, i))
            #    add_price = getattr(self, "H_" + i)
            #    add_price.setText(i +
            #        " (" + str(self.player.port.price[i]) + ")")
            self.buttonBox.accepted.connect(  # the important part
                partial(self.accept, player, window))
        def accept(self, player, window):
            if int(self.V_Total.text()) <= player.money:
                for i in player.ship.cargo:
                    num = int(getattr(self, "V_" + i).text())
                    player.ship.cargo[i] += num
                window.to_shipyard()
dia = UIinit(player, window)
dia.exec_()

Próbowałem połączyć (lambda: self.accept (gracz, okno)) i przy użyciu sam.Player i self.window jako argumenty.

0
Faller 4 grudzień 2013, 20:10

2 odpowiedzi

Najlepsza odpowiedź

Wydaje się, że ma to zrobić ze mną nadpisującą funkcję akceptacji okna dialogowego. Kiedyś zmieniłem akceptację () do Goninjagoninjago () wszystko działało dobrze.

1
Faller 4 grudzień 2013, 18:45

To uproszczone fragmenty poniżej działa zgodnie z oczekiwaniami, więc twój problem jest gdzie indziej. Wystarczy WildGuress - Jeśli kopiujesz / wklejony kodujesz, są w nim zakładki i jeśli masz mieszankę kart i przestrzeni, możesz uzyskać naprawdę dziwne wyniki - jak posiadanie def accept faktycznie zdefiniowano w __init__ Sam zamiast być właściwą metodą, w takim przypadku self nie jest automagicznie przekazywany do funkcji. Nie pasuje do Twojego komunikatu o błędzie, ale warto warto sprawdzić ....

from functools import partial

class Button(object):
    def __init__(self):
        self.callbacks = []
    def connect(self, callback):
        self.callbacks.append(callback)
    def click(self):
        for callback in self.callbacks:
            callback()

class UI(object):
    """The Dialog for initiation"""
    def __init__(self, player, window):
        self.window = window
        self.player = player
        self.button = Button()
        self.button.connect(  # the important part
            partial(self.accept, player, window))
        self.button.connect( 
            lambda: self.accept(player, window))

    def accept(self, player, window):
        print "accept %s %s" % (player, window)

    def exec_(self):
        self.button.click()
player = "p"
window = "w"
dia = UI(player, window)
dia.exec_()
3
bruno desthuilliers 4 grudzień 2013, 16:46