osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Simple board game GUI framework


On 9/11/2017 10:12 AM, Paul Moore wrote:

> Thanks for the information. That's more or less the sort of thing I
> was thinking of. In fact, from a bit more browsing, I found another
> way of approaching the problem - rather than using pygame, it turns
> out to be pretty easy to do this in tkinter.

I was going to suggest tkinter.

> The following code is basically the core of what I need:
> 
> import tkinter as tk
> 
> def create_board(root):
>      board = {}
>      for r in range(8):
>          for c in range(8):
>              lbl = tk.Button(bg="white", text="   ", font=("Consolas", 12))
>              lbl.grid(row=r, column=c)
>              board[r,c] = lbl
>      return board
> 
> root = tk.Tk()
> board = create_board(root)
> root.mainloop()

Mainloop is a blocking call, and while it is running, one can only 
interact with the data and gui in ways that one has already programmed. 
If you run the above with python -i, or equivalently, from an IDLE 
editor, you will not see a >>> prompt until you close the tk windows, at 
which point there is nothing left to interact with.

> That creates an 8x8 grid of white buttons. With this, I can make a
> button red simply by doing
> 
> board[3,2]["bg"] = "red"

However, if you run the code above from an IDLE editor, you can omit or 
comment out the mainloop call and still see the board, because IDLE's 
run code calls tk's update in a non-blocking manner about 20 times a 
second.  Without mainloop running, you immediately get a >>> prompt and 
can interact with the gui in a live exploratory fashion.  You can enter 
statements like the color assignment above, and the background updates 
will make them quickly take effect.

(I just opened https://bugs.python.org/issue31421 to document this.)

> That's really all I need. With that I can place objects on the grid by
> asking them for their colour and x/y co-ordinates. Add a bit of driver
> logic, and I have a display system. We can then spend the time working
> on how we add business logic to the classes (movement, collision
> detection, etc...)
> 
> I really need to spend some time looking into tkinter. I very rarely
> think of it when developing code, and yet whenever I do it's amazingly
> easy to put together a solution quickly and easily.

-- 
Terry Jan Reedy