habe es schon letztes Jahr weiter gemacht, doch es wurde immer komplexer und ich habe mich im Aufbau verbastelt. Hier ist mal was ich habe uns ihr könnt es zerfleddern.
Ganja --> die Anzahl der Teilungen des Vollwinkels und das Hochzählen in der Logik ist auch gleichzeitig die aktuelle Stellung des Rades. Aus dieser
Stellung kannst du den aktuellen Wert ermitteln, den du bei mir in "WHEEL_TEXT" stehen hast. Jeder Teil des Vollwinkels ist ein
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
import random
import Tkinter as tk
from PIL import Image, ImageTk, ImageDraw, ImageFont
import StringIO
import base64
from functools import partial
ANSWERS = {"SPORTS" : (("NORTH AMERICAN ",
" WATER POLO ",
" REGIONALS "),
(" ICE STICK ",
" SHOOTING ")),
"POLITICS" : ((" RECEP TAYYIP ",
" ERDOGAN "),
(" ANGELA MERKEL "),
(" WLADIMIR ",
"WLADIMIROWITSCH",
" PUTIN "),
("HEINRICH LUEBKE")),
"PROVERBS" : ((" ANY HINZ ",
" AND KUNZ "),
(" NACHTIGAL ",
" ICK HOER ",
" DIR TRAPSEN ")),
"BANDS": (((" BACK STREET ",
" BOYS ")),
((" THE TEENS ")),
(("MODERN TALKING ")))}
ALPHABET = (("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"),
("K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"),
("U", "V", "W", "X", "Y", "Z"))
VOWELS = ("A", "E", "I", "O", "U")
PLAYERS = [{"name" : "Kaytec", "score" : 0, "status" : "rotate",
"extra_status" : list()},
{"name" : "Nina", "score" : 0, "status" : "rotate",
"extra_status" : list()},
{"name" : "Maren", "score" : 0, "status" : "rotate",
"extra_status" : list()},
{"name" : "Peter", "score" : 0, "status" : "rotate",
"extra_status" : list()}]
class Wheel_of_Fortune(object):
START_INTERVAL = 20
SLOW_DOWN_STEP = 1
FONT_SIZE = 50
CIRCULAR_SEGMENT = 15
ROTATE_STEP_DEGREES = 7.5
FULL_ROTATION_STEPS = 360 / ROTATE_STEP_DEGREES
VOWEL_PRICE = 1000
WHEEL_TEXT = ("MISS A TURN", "400", "200", "900", "500", "200",
"BANKRUPT", "700", "450", "200", "400", "FREE SPIN",
"750", "400", "200", "600", "400", "150", "1000",
"800", "250", "500 GAMBLES", "300", "200")
def __init__(self, answers, alphabet, VOWELS, players):
#self.wheel = Image.open(StringIO.StringIO(base64.decodestring(
#WHEEL))).convert("RGBA")
self.wheel = Image.open("wheel.gif").convert("RGBA")
self.font = ImageFont.truetype(
"ALGER.TTF",
self.FONT_SIZE)
self.full_rotation_steps = self.FULL_ROTATION_STEPS
self.alphabet = alphabet
self.vowels = VOWELS
self.players = players
self.answers = answers
category = random.choice(self.answers.keys())
answer = random.choice(self.answers[category])
self.attributes = {"images" : list(), "speed" : self.START_INTERVAL,
"run" : True, "rotate" : False, "player" : self.next_player(True),
"answer" : {"category" : category, "answer" : answer },
"width" : self.wheel.size[0], "height" : self.wheel.size[1],
"chosen_letters" : list(), "prize" : 0}
self.attributes["images"].append([(self.attributes["width"] / 2,
self.attributes["height"] / 2), ImageTk.PhotoImage(self.wheel)])
random_index = random.choice(range(len(self.WHEEL_TEXT)))
self.text_img = self.create_text_img(random_index)
self.new_text_image_size = self.text_img.size[0]
self.random_degrees = random_index * self.CIRCULAR_SEGMENT
self.text_rotate_degrees = 0
self.degrees = 0
def set_positions(self):
self.attributes["images"] = list()
self.attributes["images"].append([(self.attributes["width"]/ 2,
self.attributes["height"] / 2),
ImageTk.PhotoImage(self.wheel.rotate(self.degrees))])
if self.attributes["player"]["status"] == "rotate":
if self.attributes["rotate"]:
self.rotate_wheel()
else:
for status in ("BANKRUPT", "FREE SPIN", "500 GAMBLES",
"MISS A TURN"):
if status == self.attributes["player"]["status"]:
if self.attributes["player"]["status"] == "BANKRUPT":
self.attributes["player"]["status"] = "rotate"
if "FREE SPIN" in self.attributes["player"][
"extra_status"]:
self.attributes["player"]["extra_status"].remove(
"FREE SPIN")
else:
self.attributes["player"]["score"] = 0
self.attributes["player"] = self.next_player()
elif self.attributes["player"]["status"] == "FREE SPIN":
self.attributes["player"]["extra_status"].append(
"FREE SPIN")
self.attributes["player"]["status"] = "rotate"
elif self.attributes["player"]["status"] == "MISS A TURN":
self.attributes["player"]["status"] = "rotate"
if "FREE SPIN" in self.attributes["player"][
"extra_status"]:
self.attributes["player"]["extra_status"].remove(
"FREE SPIN")
else:
self.attributes["player"] = self.next_player()
elif self.attributes["player"]["status"]== "500 GAMBLES":
self.attributes["player"]["extra_status"].append(
"500 GAMBLES")
self.attributes["player"]["status"] = "rotate"
def start_wheel(self):
if self.attributes["rotate"] == False:
self.attributes["rotate"] = True
def choose_letter(self, chosen_letter):
if self.attributes["player"]["status"] == "choose_letter":
old_letters = list()
for letter in self.attributes["chosen_letters"]:
old_letters.append(letter)
if chosen_letter in self.vowels:
old_score = self.attributes["player"]["score"]
new_score = old_score - self.VOWEL_PRICE
if new_score < 0:
chosen_letter = None
else:
self.attributes["player"]["score"] = new_score
for answer_part in self.attributes["answer"]["answer"]:
if len(answer_part) > 0:
for letter in answer_part:
if letter == chosen_letter:
if letter not in self.vowels:
self.attributes["player"]["score"] \
+= self.attributes["prize"]
self.attributes["chosen_letters"].append(letter)
else:
if answer_part == chosen_letter:
if letter not in self.vowels:
self.attributes["player"]["score"] \
+= self.attributes["prize"]
self.attributes["chosen_letters"].append(letter)
if len(self.attributes["chosen_letters"]) == len(old_letters) \
and chosen_letter is not None:
if "FREE SPIN" in self.attributes["player"]["extra_status"]:
self.attributes["player"]["extra_status"].remove(
"FREE SPIN")
else:
self.attributes["player"]["status"] = "rotate"
self.attributes["player"] = self.next_player()
else:
if chosen_letter is None:
self.attributes["player"]["status"] = "choose_letter"
else:
self.attributes["player"]["status"] = "rotate"
def rotate_wheel(self):
if self.degrees != self.random_degrees +\
self.full_rotation_steps * self.ROTATE_STEP_DEGREES:
if self.degrees != self.random_degrees:
self.attributes["speed"] += self.SLOW_DOWN_STEP
self.degrees += self.ROTATE_STEP_DEGREES
else:
if self.text_rotate_degrees != self.ROTATE_STEP_DEGREES \
* self.text_img.size[0]:
self.attributes["speed"] = self.START_INTERVAL
self.attributes["images"].append([(self.attributes["width"]
/ 2, self.attributes["height"] / 2), ImageTk.PhotoImage(
self.text_img.rotate(self.text_rotate_degrees).resize((
self.new_text_image_size, self.new_text_image_size)))])
self.text_rotate_degrees += self.ROTATE_STEP_DEGREES
self.new_text_image_size -= 1
else:
if self.WHEEL_TEXT[self.random_degrees /
self.CIRCULAR_SEGMENT] not in ("BANKRUPT", "FREE SPIN",
"500 GAMBLES", "MISS A TURN"):
self.attributes["player"]["status"] = "choose_letter"
self.attributes["prize"] = int(float(self.WHEEL_TEXT[
self.random_degrees / self.CIRCULAR_SEGMENT]))
else:
self.attributes["player"]["status"] = self.WHEEL_TEXT[
self.random_degrees / self.CIRCULAR_SEGMENT]
self.text_rotate_degrees = 0
random_index = random.choice(range(len(self.WHEEL_TEXT)))
self.text_img = self.create_text_img(random_index)
self.new_text_image_size = self.text_img.size[0]
self.random_degrees = random_index * self.CIRCULAR_SEGMENT
self.text_rotate_degrees = 0
self.degrees -= self.FULL_ROTATION_STEPS \
* self.ROTATE_STEP_DEGREES * 2
self.attributes["rotate"] = False
def create_text_img(self, index):
text = self.WHEEL_TEXT[index]
text_img = Image.new("RGBA", (self.font.getsize(text)[0],
self.font.getsize(text)[0]))
draw = ImageDraw.Draw(text_img)
draw.text((0, self.font.getsize(text)[0] / 2
- self.font.getsize(text)[1] / 2 - 5),
text, (255, 255, 255), font = self.font)
return text_img
def next_player(self, first_start = False):
if first_start:
random.shuffle(self.players)
else:
self.players.reverse()
last_player = self.players.pop()
self.players.reverse()
self.players.append(last_player)
return self.players[0]
class Wheel_of_Fortune_Gui(object):
def __init__(self, root):
self.root = root
self.letter_buttons = dict()
self.answer_labels = list()
self.wheel_of_fortune = Wheel_of_Fortune(ANSWERS, ALPHABET,
VOWELS, PLAYERS)
self.canvas = tk.Canvas(root, width=self.wheel_of_fortune.attributes[
"width"],height=self.wheel_of_fortune.attributes["height"])
self.canvas.grid(row=0, column=0, padx=4, pady=4)
for attributes in self.wheel_of_fortune.attributes["images"]:
pos, img = attributes
x, y = pos
self.canvas.create_image(x, y, image=img)
control_frame = tk.LabelFrame(root, relief=tk.FLAT)
control_frame.grid(row=0, column=1)
self.player_frame = tk.LabelFrame(control_frame,
text=self.wheel_of_fortune.attributes[
"player"]["name"],relief=tk.SOLID)
self.player_frame.grid(row=0, column=0, sticky=tk.W+tk.E+tk.N+tk.S,
padx=4, pady=4)
self.score_label = tk.Label(self.player_frame,
text=self.wheel_of_fortune.attributes["player"]["score"])
self.score_label.pack(side=tk.TOP)
answers_frame = tk.LabelFrame(control_frame, relief=tk.SOLID,
text=self.wheel_of_fortune.attributes["answer"]["category"])
def create_label(frame, letter, row, column):
if letter == " ":
relief = tk.FLAT
else:
relief = tk.SOLID
label=tk.Label(frame, text="", width=2, relief=relief,
font="Arial 11")
label.grid(row=row, column=column, padx=2, pady=4)
return label
row = 0
for column, answer_parts in enumerate(self.wheel_of_fortune.attributes[
"answer"]["answer"]):
if len(answer_parts) > 1:
labels = list()
row += 1
for column, letter in enumerate(answer_parts):
labels.append(create_label(answers_frame, letter, row,
column))
self.answer_labels.append(labels)
else:
self.answer_labels.append(create_label(answers_frame,
answer_parts, row, column))
answers_frame.grid(row=1, column=0, sticky=tk.W+tk.E+tk.N+tk.S, padx=4,
pady=4)
letter_frame = tk.LabelFrame(control_frame, text="Letters",
relief=tk.SOLID)
for row, letters in enumerate(ALPHABET):
for column, letter in enumerate(letters):
button = tk.Button(letter_frame, text=letter, width=1,
command=partial(self.choose_letter, letter))
button.grid(row=row, column=column)
if letter in VOWELS:
button.config(fg = "red")
self.letter_buttons[letter] = button
letter_frame.grid(row=2, column=0, padx=4, pady=4)
tk.Button(control_frame, text='ROTATE WHEEL',
command=self.wheel_of_fortune.start_wheel).grid(row=3,
column=0)
self.after_id = None
def start_wheel(self):
self.wheel_of_fortune.start_wheel()
def choose_letter(self, letter):
self.wheel_of_fortune.choose_letter(letter)
def run(self):
self.wheel_of_fortune.set_positions()
self.canvas.delete(tk.ALL)
for attributes in self.wheel_of_fortune.attributes["images"]:
pos, img = attributes
x, y = pos
self.canvas.create_image(x, y, image=img)
self.score_label.config(text=self.wheel_of_fortune.attributes[
"player"]["score"])
self.player_frame.config(text=self.wheel_of_fortune.attributes[
"player"]["name"])
for labels, answer_part in zip(self.answer_labels,
self.wheel_of_fortune.attributes["answer"]["answer"]):
if len(answer_part) > 1:
for letter, label in zip(answer_part, labels):
if letter in self.wheel_of_fortune.attributes[
"chosen_letters"]:
label.config(text=letter, fg="black")
else:
if answer_part in self.wheel_of_fortune.attributes[
"chosen_letters"]:
labels.config(text=answer_part, fg="black")
for letter in self.wheel_of_fortune.attributes["chosen_letters"]:
self.letter_buttons[letter].config(state=tk.DISABLED)
if self.wheel_of_fortune.attributes["run"]:
self.after_id = self.root.after(self.wheel_of_fortune.attributes[
"speed"], self.run)
else:
self.root.after_cancel(self.after_id)
self.after_id = None
def release(self):
self.root.after_cancel(self.after_id)
self.root.destroy()
def main():
root = tk.Tk()
root.title('WHEEL OF FORTUNE')
wheel_of_fortune_gui = Wheel_of_Fortune_Gui(root)
wheel_of_fortune_gui.run()
root.protocol("WM_DELETE_WINDOW", wheel_of_fortune_gui.release)
root.mainloop()
if __name__ == '__main__':
main()