Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from collections import deque
from functools import partial
from random import randint
class Game(object):
def __init__(self):
self.current_digit = 4
self.digits = deque()
self.max_digit_count = 10
def clear_digits(self):
self.digits.clear()
def add_random_digit(self):
if len(self.digits) >= self.max_digit_count:
raise ValueError('max digits reached')
self.digits.append(randint(1, 9))
self.check_and_remove()
def change_current_digit(self, amount):
self.current_digit = (self.current_digit - 1 + amount) % 9 + 1
self.check_and_remove()
def check_and_remove(self):
while self.digits and self.digits[0] == self.current_digit:
self.digits.popleft()
class WheelUI(tk.Frame):
def __init__(self, parent, game):
tk.Frame.__init__(self, parent)
self.game = game
self.digit_labels = list()
for font in ['Arial 20', 'Arial 30', 'Arial 20']:
label = tk.Label(
self, font=font, width=3, relief=tk.GROOVE, borderwidth=2
)
label.pack(side=tk.TOP)
self.digit_labels.append(label)
self.update_display()
def update_display(self):
current_digit = self.game.current_digit
for digit, label in zip(
range(current_digit - 1, current_digit + 2), self.digit_labels
):
if digit == 0:
digit = 9
elif digit == 10:
digit = 1
label['text'] = digit
class GameUI(tk.Frame):
def __init__(self, parent, game):
tk.Frame.__init__(self, parent)
self.game = game
self.after_id = None
self.wheel = WheelUI(self, self.game)
self.wheel.pack(side=tk.LEFT)
self.scroller_label = tk.Label(
self, width=10, font='Arial 22', relief=tk.GROOVE, borderwidth=2
)
self.scroller_label.pack(side=tk.LEFT)
self.update_display()
self.scroller_label.config(text='Press Enter', anchor=tk.CENTER)
toplevel = self.winfo_toplevel()
toplevel.bind('<Return>', self.on_return)
toplevel.bind('<Up>', partial(self.on_change_wheel, -1))
toplevel.bind('<Down>', partial(self.on_change_wheel, 1))
def update_display(self):
self.wheel.update_display()
self.scroller_label.config(
text=''.join(str(d) for d in self.game.digits), anchor=tk.E
)
def _game_step(self):
try:
self.game.add_random_digit()
except ValueError:
self.scroller_label.config(text='Game Over', anchor=tk.CENTER)
self.after_id = None
else:
self.update_display()
self.after_id = self.after(1000, self._game_step)
def on_return(self, _event=None):
if not self.after_id:
self.game.clear_digits()
self._game_step()
def on_change_wheel(self, amount, _event=None):
if self.after_id:
self.game.change_current_digit(amount)
self.update_display()
def main():
root = tk.Tk()
root.title('Zahlenlaufband')
game = Game()
game_ui = GameUI(root, game)
game_ui.pack()
root.mainloop()
if __name__ == '__main__':
main()