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