-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgui.py
82 lines (67 loc) · 2.92 KB
/
gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from tkinter import *
from tkinter.messagebox import showinfo
import protocol
class Window(Frame):
def create_btn(self, board, x, y):
frame = Frame(board, width=40, height=40)
frame.place(x=x * 40, y=y * 40)
btn = Button(
frame,
width=40,
height=40,
bg="#999999",
activebackground="#aaaaaa",
command=lambda: self.requests_queue.put(protocol.request_do_turn(x, y))
)
btn.place(x=0, y=0)
return btn
def create_board(self, width, height):
self.board_buttons = []
board = Frame(self.master, width=40 * width, height=40 * height, bg="#bbbbbb")
board.place(x=100, y=40)
for i in range(width):
row = []
for j in range(height):
row.append(self.create_btn(board, i, j))
self.board_buttons.append(row)
def create_player_indicator(self):
self.player_indicator_canvas = Canvas(self.master, width=35, height=20)
self.player_indicator_canvas.place(x=10, y=120)
self.player_indicator_canvas_id = self.player_indicator_canvas.create_rectangle(0, 0, 35, 20, fill="#999999")
def refill_player_indicator(self, color):
self.player_indicator_canvas.itemconfig(self.player_indicator_canvas_id, fill=color)
def __init__(self, responses_queue, requests_queue, master=None):
Frame.__init__(self, master)
self.master = master
self.pack(fill=BOTH, expand=1)
self.responses_queue = responses_queue
self.requests_queue = requests_queue
Button(self.master, text="Start", command=self.start_game).place(x=10, y=40)
Button(self.master, text="Cancel", command=self.cancel_move).place(x=10, y=80)
self.create_player_indicator()
self.master.after(400, self.handle_resps)
def start_game(self):
self.create_board(10, 10)
self.requests_queue.put(protocol.request_start())
def cancel_move(self):
self.requests_queue.put(protocol.request_cancel())
def handle_resp(self, resp):
if resp.resp_type == "Error":
showinfo("Error", resp.resp_info)
elif resp.resp_type == "Update":
for tile in resp.resp_info.tiles:
self.board_buttons[tile.pos[0]][tile.pos[1]].config(bg=tile.color)
self.refill_player_indicator(resp.resp_info.player)
def handle_resps(self):
print('Handling tasks...')
while not self.responses_queue.empty():
resp = self.responses_queue.get()
print("Handling task: %s" % resp)
self.handle_resp(protocol.parse_response(resp))
self.master.after(200, self.handle_resps) # called only once!
def start(responses_queue, requests_queue):
root = Tk()
root.geometry("720x480")
root.title("Reversi")
Window(master=root, responses_queue=responses_queue, requests_queue=requests_queue)
root.mainloop()