def __create_module_button(self, module, window): module_button = Button(window, text=f"{module.module_type}\n({module.id})") module_type = str(module.__class__) if 'output' in module_type: color = "orange" elif 'input' in module_type: color = "purple" else: color = "yellow" module_button.configure(bg=color, command=lambda: self.__change_module(module)) # TODO: Update button position as the module changes its position module_button.place( x=170 + 60 * module.position[0], y=180 - 40 * module.position[1], width=60, height=40, ) # module button list self._modules.append(module_button)
class RoundSettings: def __init__(self): self.win = tk.Tk() self.win.title("Round Settings") self.choose_frame = tk.Frame(self.win) self.confirm_frame = tk.Frame(self.win, width=100) self.frame1 = tk.Frame(self.choose_frame) self.frame2 = tk.Frame(self.choose_frame) self.frame3 = tk.Frame(self.choose_frame) self.first_hint = tk.Label(self.frame1, text="Choose which side will play first") self.me_first = Button(self.frame1, text="Me", command=self.click_me_first) self.opponent_first = Button(self.frame1, text="Opponent", command=self.click_opponent_first) self.player_hint = tk.Label(self.frame2, text="Choose which side you will play for") self.for_black = Button(self.frame2, text="Black Chess", command=self.click_for_black) self.for_white = Button(self.frame2, text="White Chess", command=self.click_for_white) self.up_hint = tk.Label(self.frame3, text="Choose which side will on the upper") self.white_up = Button(self.frame3, text="White Chess", command=self.click_white_up) self.black_up = Button(self.frame3, text="Black Chess", command=self.click_black_up) self.confirm_button = tk.Button(self.confirm_frame, width=10, height=10, text='play', command=self.click_confirm) def choose(self): self.first_hint.pack(side=tk.TOP) self.me_first.pack(side=tk.LEFT) self.opponent_first.pack(side=tk.RIGHT) self.player_hint.pack(side=tk.TOP) self.for_black.pack(side=tk.LEFT) self.for_white.pack(side=tk.RIGHT) self.up_hint.pack(side=tk.TOP) self.white_up.pack(side=tk.LEFT) self.black_up.pack(side=tk.RIGHT) self.confirm_button.pack() self.frame1.pack() self.frame2.pack() self.frame3.pack() self.choose_frame.pack(side=tk.LEFT) self.confirm_frame.pack(side=tk.RIGHT) self.win.mainloop() def click_me_first(self): global first_player first_player = 'me' self.me_first.configure(fg='white', bg='deepskyblue') self.opponent_first.configure(fg='black', bg='white') def click_opponent_first(self): global first_player first_player = 'opponent' self.opponent_first.configure(fg='white', bg='deepskyblue') self.me_first.configure(fg='black', bg='white') def click_for_black(self): global side side = 'black' self.for_black.configure(fg='white', bg='deepskyblue') self.for_white.configure(fg='black', bg='white') def click_for_white(self): global side side = 'white' self.for_white.configure(fg='white', bg='deepskyblue') self.for_black.configure(fg='black', bg='white') def click_white_up(self): global upper_chess upper_chess = 'white' self.white_up.configure(fg='white', bg='deepskyblue') self.black_up.configure(fg='black', bg='white') def click_black_up(self): global upper_chess upper_chess = 'black' self.black_up.configure(fg='white', bg='deepskyblue') self.white_up.configure(fg='black', bg='white') def click_confirm(self): self.win.destroy()
def app(): # begin gui global root root = tk.Tk() # root window root.title("Runkeeper") root.geometry("530x300+1300+290") root.configure(bg="#2c6b6f") # greeting labels greeting1 = tk.Label(root, text="Add Data") greeting1.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 18), pady=16) greeting1.grid(row=0, column=1, sticky=tk.N) greeting2 = tk.Label(root, text="Enter info below:") greeting2.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), pady=4) greeting2.grid(row=1, column=1) greeting3 = tk.Label(root, text="See Running Statistics") greeting3.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 18), pady=16) greeting3.grid(row=0, column=3, sticky=tk.N) greeting2 = tk.Label(root, text="Analysis options:") greeting2.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), pady=4) greeting2.grid(row=1, column=3) # spacer blank1 = tk.Label(root, text="space") blank1.configure(bg="#2c6b6f", fg="#2c6b6f") blank1.grid(row=0, column=2) # status label global status status = tk.Label(root, text="Welcome to Runkeeper!") status.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), pady=4) status.grid(row=6, column=1) # item labels labels = [ tk.Label(root, text="Date"), tk.Label(root, text="Distance"), tk.Label(root, text="Duration") ] labels[0].grid(row=2) labels[1].grid(row=3) labels[2].grid(row=4) labels[0].configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), padx=5, pady=4) labels[1].configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), padx=5, pady=4) labels[2].configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14), padx=5, pady=4) # entry boxes global e1, e2, e3 e1 = tk.Entry(root) e2 = tk.Entry(root) e3 = tk.Entry(root) e1.insert(0, "10/21/21") e2.insert(0, "3.52") e3.insert(0, "22:17") e1.configure(fg="#808080") e2.configure(fg="#808080") e3.configure(fg="#808080") e1.grid(row=2, column=1) e2.grid(row=3, column=1) e3.grid(row=4, column=1) e1.bind('<FocusIn>', entry_click1) e2.bind('<FocusIn>', entry_click2) e3.bind('<FocusIn>', entry_click3) # submit button submitButton = Button(root, text='Submit', command=submit, borderless=1) submitButton.configure(pady=4, bg="white", fg="black", font=("Open Sans", 14)) submitButton.grid(row=5, column=1, pady=4) # total distance button submitButton = Button(root, text='Total Distance', command=grab_dist, borderless=1) submitButton.configure(pady=4, bg="white", fg="black", font=("Open Sans", 14)) submitButton.grid(row=2, column=3) # average pace button submitButton = Button(root, text='Average Pace', command=grab_avgpace, borderless=1) submitButton.configure(pady=4, bg="white", fg="black", font=("Open Sans", 14)) submitButton.grid(row=3, column=3) # total time button submitButton = Button(root, text='Total Time', command=grab_totaltime, borderless=1) submitButton.configure(pady=4, bg="white", fg="black", font=("Open Sans", 14)) submitButton.grid(row=4, column=3) # data analysis text stats_greeting = tk.Label(root, text="Stats:") stats_greeting.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14)) stats_greeting.grid(row=5, column=3, pady=8) global stats_text stats_text = tk.Label( root, text="Press a button to view \nyour running statistics.") stats_text.configure(bg="#2c6b6f", fg="white", font=("Open Sans", 14)) stats_text.grid(row=6, column=3, pady=8) # keep running until window closed root.mainloop() # keep running until window closed
class GoGUIPlayer(): ## Decorators def valid_stone(func): def wrapper(*args, **kwargs): if not args[1] or not isinstance(args[1], StoneEnum): raise Exception("GPB: Invalid parameter, bad stone passed.") return func(*args, **kwargs) return wrapper def protocol_registered(func): def wrapper(*args, **kwargs): if not args[0].name: raise Exception( "GPB: Invalid protocol, player must be registered first.") return func(*args, **kwargs) return wrapper def protocol_stone_set(func): def wrapper(*args, **kwargs): if not args[0].stone_type: raise Exception( "GPB: Invalid protocol, stone must be received first.") return func(*args, **kwargs) return wrapper # Constructor def __init__(self, name=None): self.name = name self.default_name = "Player 1" self.stone_type = None self.color = "" self.move_referee = MoveReferee() self.click = None # Creates self.root window self.root = Tk() self.root.title("Go Game GUI") self.root.resizable(0, 0) self.root.geometry('1000x1000') self.e = Entry(self.root, text="ENTER YOUR NAME HERE", width=20, borderwidth=5, bg="yellow", fg="black") self.e.grid(row=0, column=0, columnspan=7) self.e1 = Entry(self.root, width=20, borderwidth=5, bg="yellow", fg="black") self.e1.grid(row=10, column=0, columnspan=7) self.button_register = Button(self.root, text="Register", command=self.myClick) self.button_move = Button(self.root, text="Make Move", command=self.myMove) self.pass_move = Button(self.root, text="Pass", command=self.Pass) self.button_register.grid(row=0, column=10, columnspan=1) self.button_move.grid(row=10, column=10, columnspan=1) self.pass_move.grid(row=9, column=10, columnspan=1) self.buttons = dict() for x in range(1, BOARD_DIM + 1): for y in range(1, BOARD_DIM + 1): button_num = "{}-{}".format(y, x) self.buttons["{}-{}".format(y, x)] = Button( self.root, text=" ", bg="goldenrod", padx=0.0, pady=20, command=lambda butt=button_num: self.button_click(butt)) self.buttons["{}-{}".format(y, x)].grid(row=x, column=y, columnspan=1) def myClick(self): self.name = self.e.get() hello = "Welcome to Go, " + self.name myLabel = Label(self.root, text=hello) myLabel.grid(row=0, column=0, columnspan=3) self.button_register.configure(state=DISABLED) def button_click(self, button_idx): if self.name: self.click = button_idx self.buttons[self.click].configure(bg=self.color) def myMove(self): if self.name: self.click = self.e1.get() def Pass(self): if self.name: self.click = "pass" def register(self): while not self.name: self.root.update() self.root.update_idletasks() return self.name def receive_stone(self, stone_type): self.stone_type = stone_type if stone_type == StoneEnum.BLACK: self.color = "black" else: self.color = "white" def choose_move(self, boards): if not self.move_referee.valid_history(self.stone_type, boards): return "This history makes no sense!" else: board = boards[0] for x in range(len(board)): for y in range(len(board[0])): if board[x][y].get_raw() == WHITE_STONE: self.buttons["{}-{}".format(x + 1, y + 1)].configure(bg="white") elif board[x][y].get_raw() == BLACK_STONE: self.buttons["{}-{}".format(x + 1, y + 1)].configure(bg="black") else: self.buttons["{}-{}".format( x + 1, y + 1)].configure(bg="goldenrod") while not self.click: self.root.update() self.root.update_idletasks() if self.click == "pass": self.click = None return PASS ret = str_to_point(self.click) #if not self.move_referee.valid_move(stone_type=self.stone_type, point=ret, boards=boards, current_board=board): # raise Exception("Invalid point.") self.click = None return (ret.x, ret.y)