2016-04-30 12 views
0

Ich versuche derzeit, das Eingabe-Widget in tkinter zu verwenden, um eine Nummer vom Benutzer zu erhalten, und dann diese Nummer zu verwenden, um einen Parameter einer meiner anderen Funktionen zu definieren.Python tkinter Eingabe Widget Verwendung

Der Code ist sehr lang, also werde ich versuchen, meine Gedanken nach dem Block zusammenzufassen.

class NimGame(): 

    def __init__(self, numberOfBalls): 
     self.numberOfBallsRemaining = numberOfBalls 
     print("Nim game initialized with {} balls.".format(self.numberOfBallsRemaining)) 

    def remainingBalls(self): 
     return self.numberOfBallsRemaining 

    def take(self, numberOfBalls): 
     if (numberOfBalls < 1) or (numberOfBalls > 3) or (numberOfBalls > self.numberOfBallsRemaining): 
      print("You can't take that number of balls. Try again.") 
      # ## Update Label in the GUI to tell user they can't take that many balls. 
      # It might be better to "inactivate" the buttons that correspond to invalid number to take. 
      statusLabel.configure(text="You can't take that number of balls. Try again.") 
     else: 
      self.numberOfBallsRemaining = self.numberOfBallsRemaining - numberOfBalls 
      print("You took {} balls. {} remain.".format(numberOfBalls, self.numberOfBallsRemaining)) 
      if self.numberOfBallsRemaining == 0: 
       print("Computer wins!") 
      else: 
       # ## After removing player-chosen balls, update graphics and then pause for 1.0 seconds 
       # before removing computer-chosen balls. This way the player can "see" the 
       # intermediate status. Perhaps think about a nicer way of showing this. 
       updateGraphics() 
       sleep(1.0) 

       computerMaxBalls = min(3, self.numberOfBallsRemaining) 
       compBallsTaken = random.randint(1,computerMaxBalls) 
       self.numberOfBallsRemaining = self.numberOfBallsRemaining - compBallsTaken 

       # ## After removing computer-chosen balls, update graphics again. 
       updateGraphics() 
       print("Computer took {} balls. {} remain.".format(compBallsTaken, self.numberOfBallsRemaining)) 
       if self.numberOfBallsRemaining == 0: 
        print("You win!") 

def updateGraphics(): 
    canvas.delete('all') 
    centerX = leftmostBallXPosition 
    centerY = ballYPosition 
    for i in range(nimGame.remainingBalls()): 
     canvas.create_oval(centerX - halfBallSize, 
          centerY - halfBallSize, 
          centerX + halfBallSize, 
          centerY + halfBallSize, 
          fill="#9999ff") 
     centerX = centerX + spaceBetweenBalls + ballSize 
     canvas.update_idletasks() 

def initializeNewGame(): 
    numberOfBalls = e1.get() 
    initializeNimAndGUI(numberOfBalls) 

def initializeNimAndGUI(numberOfBalls): 
    global nimGame 
    global ballSize, halfBallSize, spaceBetweenBalls, leftmostBallXPosition, ballYPosition 

    nimGame = NimGame(numberOfBalls) 

    canvas.delete('all') 
    ballSize = min(maxBallSize, int(((canvasWidth-canvasBorderBuffer)//numberOfBalls)/1.2)) 
    halfBallSize = ballSize // 2 
    spaceBetweenBalls = int(0.2 * ballSize) 
    leftmostBallXPosition = (canvasBorderBuffer//2) + (spaceBetweenBalls//2) + halfBallSize 
    ballYPosition = canvasHeight // 2 
    updateGraphics() 

def createGUI(): 
    global rootWindow 
    global canvas 
    global statusLabel 
    global textEntry 
    global e1 

    rootWindow = Tk() 
    canvasAndButtons = Frame(rootWindow) 
    canvas = Canvas(canvasAndButtons, height=canvasHeight, width=canvasWidth, relief=SUNKEN, borderwidth=2) 
    canvas.pack(side=LEFT) 

    buttonframe = Frame(canvasAndButtons) 
    e1 = Entry(buttonframe) 
    e1.pack() 
    button1 = Button(buttonframe, text='Take 1', command=lambda:takeBalls(1)) 
    button2 = Button(buttonframe, text='Take 2', command=lambda:takeBalls(2)) 
    button3 = Button(buttonframe, text='Take 3', command=lambda:takeBalls(3)) 
    button4 = Button(buttonframe, text='New Game', command=initializeNewGame) 
    button1.pack() 
    button2.pack() 
    button3.pack() 
    button4.pack() 
    buttonframe.pack(side=RIGHT) 
    canvasAndButtons.pack() 
    statusLabel = Label(rootWindow, text="Play Nim") 
    statusLabel.pack() 

def runNim(numberOfBalls): 
    createGUI() 
    initializeNimAndGUI(numberOfBalls) 
    rootWindow.mainloop() 

mir So scheint es, dass das Programm Probleme ist mit der Grafik aktualisieren, wenn ich ein zweites Spiel zu tun. Was passiert, wenn ich zum Beispiel runNim (20) rufe und ein Spiel mit 20 Bällen spiele. Nach dem Spiel muss ich in der Lage sein, eine Nummer in das Eingabe-Widget einzugeben, auf ein neues Spiel zu klicken und die neue Nummer der Nummer zu haben. Wenn ich das mache, bekomme ich die Nachricht init zurück mit der Angabe "Nim Spiel initialisiert mit 10 Bällen." Aber die GUI ändert sich nicht, keine Kugeln erscheinen in der GUI, und wenn ich versuche, etwas zu nehmen, gibt es Rückverfolgung und Fehler.

+0

Haben Sie e1.get() ausprobiert? Das liest den Wert, den der Benutzer in das Eingabefeld eingegeben hat. Was sind die Trace-Back-Fehler? – AR06

+0

Datei "Datei-Info", Zeile 1549 in \ __ call__ return self.func (* args) Datei "Datei-Info", Linie 86, in initializeNewGame initializeNimAndGUI (numberofBalls) Datei "Datei-Info", line 102 , in initializeNimAndGUI ballSize = min (maxBallSize, int (((canvasWidth-canvasBorderBuffer) // numberOfBalls) /1.2)) – CabooseMSG

+0

Für meine numberOfBalls habe ich e1.get(). Aber mir wurde gesagt, dass eine Saite zurückkehrt, und ich brauche einen Int. Was verwende ich, um in dieser Situation ein int zurückzugeben? – CabooseMSG

Antwort

1

Ich habe mein Problem herausgefunden. Als ich versuchte, die Zeichenfolge von e1.get() in eine ganze Zahl zu konvertieren, wurde die leere Zeichenfolge nicht berücksichtigt, wenn ich das Programm zum ersten Mal ausführte. Dies gab mir einen ValueError: ungültiges Literal für int() mit Basis 10: ''. Also musste ich das erklären, und jetzt funktioniert es.