Skip to content

Instantly share code, notes, and snippets.

@Specnr
Last active May 8, 2023 01:40
Show Gist options
  • Save Specnr/520343e9ba0b6c551d1d3de4c62dc1f5 to your computer and use it in GitHub Desktop.
Save Specnr/520343e9ba0b6c551d1d3de4c62dc1f5 to your computer and use it in GitHub Desktop.
A Tkinter GUI which writes commands for the tourney controller to read
import tkinter as tk
from tkinter import ttk
import os
import time
ROWS, COLS = 2, 3
path = os.path.dirname(os.path.realpath(__file__))
obstxtPath = os.path.abspath(os.path.realpath(
os.path.join(path, 'data', 'obs.txt')))
twitchtxtPath = os.path.abspath(os.path.realpath(
os.path.join(path, 'data', 'twitch_usernames.txt')))
def write_to_file(cmd):
with open(obstxtPath, 'w') as f:
f.write(cmd)
def read_twitch_names():
names = []
with open(twitchtxtPath, 'r') as f:
for line in f:
names.append(line.strip())
return names
def swap_players(idx1, idx2):
write_to_file(f"sw{idx1}{idx2}")
def set_player(idx, name):
write_to_file(f"s{idx}{name}")
def focus_player(idx, name):
write_to_file(f"f{idx}{name}")
def main_screen():
write_to_file("m")
class Rectangle:
def __init__(self, master, grid, row, col):
self.master = master
self.grid = grid
self.row = row
self.col = col
self.idx = COLS * self.row + self.col
self.value = tk.StringVar(value=self.grid.twitch_names[self.idx])
set_player(self.idx + 1, self.grid.twitch_names[self.idx])
self.isSelected = tk.BooleanVar(value=False)
self.rectangle_frame = tk.Frame(self.master, bg="white", borderwidth=2, relief="groove", width=100, height=100)
self.rectangle_frame.grid(row=self.row, column=self.col, padx=20, pady=20)
self.dropdown = ttk.Combobox(self.rectangle_frame, values=self.grid.twitch_names, textvariable=self.value, width=20, font=("TkDefaultFont", 16))
self.dropdown.pack(side="left", padx=10, pady=10)
self.checkbox = tk.Checkbutton(self.rectangle_frame, variable=self.isSelected, command=self.on_checkbox_click)
self.checkbox.pack(side="left")
self.dropdown.bind("<<ComboboxSelected>>", self.on_dropdown_select)
self.dropdown.bind("<KeyRelease>", self.on_dropdown_key_release)
def on_dropdown_select(self, event):
set_player(self.idx + 1, self.dropdown.get())
self.value.set(self.dropdown.get())
self.dropdown.configure(values=self.grid.twitch_names)
def on_checkbox_click(self):
if self.isSelected.get():
self.grid.on_rectangle_select(self)
else:
self.grid.on_rectangle_deselect(self)
def on_dropdown_key_release(self, event):
search_text = self.dropdown.get().lower()
if search_text == "":
self.dropdown.configure(values=self.grid.twitch_names)
else:
matches = []
for option in self.dropdown["values"]:
if search_text in option.lower():
matches.append(option)
self.dropdown.configure(values=matches)
def swap_with(self, other):
temp_value = self.value.get()
self.value.set(other.value.get())
other.value.set(temp_value)
temp_is_selected = self.isSelected.get()
self.isSelected.set(other.isSelected.get())
other.isSelected.set(temp_is_selected)
class RectangleGrid:
def __init__(self, master):
self.master = master
self.master.resizable(False, False)
self.rectangles = []
self.twitch_names = read_twitch_names()
for row in range(ROWS):
for col in range(COLS):
self.rectangles.append(Rectangle(self.master, self, row, col))
time.sleep(0.25)
main_screen()
self.selected_rectangles = []
self.focus_button = tk.Button(self.master, text="Focus", command=self.on_focus, state="disabled", width=10, pady=5)
self.main_button = tk.Button(self.master, text="Main", command=main_screen, width=10, pady=5)
self.focus_button.grid(row=2, column=0, pady=10, columnspan=2) # set columnspan to 2
self.main_button.grid(row=2, column=1, pady=10, columnspan=2) # set columnspan to 2
def swap_logic(self):
if len(self.selected_rectangles) == 2:
self.selected_rectangles[0].swap_with(self.selected_rectangles[1])
for rect in self.selected_rectangles:
rect.dropdown.selection_clear()
rect.isSelected.set(False)
self.selected_rectangles = []
def on_focus(self):
if len(self.selected_rectangles) == 1:
focus_player(self.selected_rectangles[0].idx + 1, self.selected_rectangles[0].value.get())
if self.selected_rectangles[0].idx > 0:
self.selected_rectangles.append(self.rectangles[0])
self.swap_logic()
self.focus_button.config(state="disabled")
def on_swap(self):
if len(self.selected_rectangles) == 2:
swap_players(self.selected_rectangles[0].idx + 1, self.selected_rectangles[1].idx + 1)
self.swap_logic()
self.focus_button.config(state="disabled")
def on_rectangle_select(self, rectangle):
self.selected_rectangles.append(rectangle)
if len(self.selected_rectangles) == 1:
self.focus_button.config(state="normal")
self.on_swap()
def on_rectangle_deselect(self, rectangle):
self.selected_rectangles.remove(rectangle)
self.focus_button.config(state="disabled")
print("BOOTING...")
root = tk.Tk()
root.title("Tournament Controller")
grid = RectangleGrid(root)
print("READY!")
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment