Problem with calling functions with tkinter

Problem with calling functions with tkinter


from tkinter import *
from random import *


root = Tk()

#A function to create the turn for the current player. The current player isnt in this code as it is not important
def turn():
window = Tk()
dice = Button(window, text="Roll the dice!", bg= "white", command=lambda:diceAction(window))
dice.pack()
window.mainloop()

#a function to simulate a dice. It kills the function turn.
def diceAction(window):
result = Tk()
y = randint(1, 6)
quitButton = Button(result, text="Ok!", bg="white", command=result.destroy)
quitButton.pack()
window.destroy()
result.mainloop()


#A function to create the playing field and to start the game
def main():
label1 = Button(root, text="hi", bg="black")

label1.pack()


while 1:
turn()
print("Hi")
turn()


main()

root.mainloop()



My problem is that the code in the while function after the first turn() the code isnt executed until i close the root window(which i dont want because it represents the playing field). You can copy this code and execute it yourself if you want.



I have no idea what causes this and havent found anything online. Sorry for the long code but i wrote it so that it is executeable.




1 Answer
1



I don't know why this particular problem is occurring, but there are a couple of things in your code that are considered bad practice.
Instead of creating multiple instances of Tk(), you should use Toplevel widgets for any pop-up windows needed. Also, it's better to use root.mainloop() to run the program rather than a while loop.



I've made some edits to your code so that it uses a Toplevel widget and discards of the while loop.


from tkinter import *
from random import *


#A function to create the turn for the current player. The current player isnt in this code as it is not important
def turn(prev=None):
# destroy the previous turn
if prev:
prev.destroy()

# pop up with dice
window = Toplevel()
dice = Button(window, text="Roll the dice!", bg= "white")
dice.config(command=lambda b=dice, w=window:diceAction(b, w))
dice.pack()


#a function to simulate a dice, reconfigures the pop-up
def diceAction(button, window):
# roll dice
y = randint(1, 6)
# use dice result here?
print(y)

# reconfigure button, the command now starts a new turn
button.config(text='ok', command=lambda w=window:turn(prev=w))




root = Tk()

# I hijacked this button to use as a start button
label1 = Button(root, text="hi", bg="black", command=turn)
label1.pack()

root.mainloop()



I don't know if this is what you need, but it functions as the code in the question would if it worked.
Sorry I couldn't help with the cause of the error.





Thanks for your reply! Is it possible to automatically start the turn process without the need to press a button?
– The S1
Sep 3 at 9:45






Yes, if you call the turn function just before you start mainloop.
– strava
Sep 3 at 9:48





Unfortunatly it doesnt quite work. The reason i call turn() in the code 2 times, is because i give it the parameter player1/player2(which is currentPlayer in the function). With this method it would always use the same player :/
– The S1
Sep 3 at 11:25






Hey it kinda works now but i have a different problem: I call turn() 2 times in while ith player1 and player2. The problem is that the 2nd turn() doesnt "wait" for the first one to finish(aka for me the button to press). I want them to pop up after each other, do you have any idea how to implement this?
– The S1
Sep 3 at 13:42





You could just call turn once, and then have a parameter that you swapped each time for player 1/2
– strava
Sep 4 at 6:38



Thanks for contributing an answer to Stack Overflow!



But avoid



To learn more, see our tips on writing great answers.



Some of your past answers have not been well-received, and you're in danger of being blocked from answering.



Please pay close attention to the following guidance:



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)