Anfänger frage wheel of fortune

Fragen zu Tkinter.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,

Hat das schon jemand gemacht? Meine Kinder haben Ideen :cry: ! ich habe ein wenig recherchiert finde aber nichts im netz, geht das gar nicht mit tkinter? Hab ein wenig über Canvas gelesen und schon einen kreis und Rechteck erstellt, aber ich weis nicht wie ich den kreis aufteilen soll und der sollte sich drehen und dann anhalten, ist das überhaupt machbar? In Java habe ich es gefunden und es läuft nicht schlecht aber mein rapi wird mit 30% cpu belastet, alles was ich bis jetzt mit python tkinter gemacht habe, hat die cpu max 10% belastet, daher dachte ich wieder an tkinter vielleicht auch qt, ihr seid die Profis ihr wisst ob es überhaupt machbar ist!

Vielen Dank

Gruß ganja
BlackJack

@ganja: Text rotieren ist mit dem `Canvas` von Tk wohl nicht drin, da wird man sich also nach einem anderen GUI-Rahmenwerk umsehen müssen. Mit Qt sollte das gehen.

Alternativ könntest Du auch versuchen Dich nicht so exakt an die Spielshow zu halten was die Darstellung angeht. Man könnte die Felder des Rads beispielsweise auch als Rechtecke neben oder übereinander anordnen und dann horizontal oder vertikal scrollen/rotieren lassen. Oder man nimmt ein vorbereitetes Bild von dem Rad und rotiert nicht das Rad sondern zeichnet mit Tk eine Markierung die am Rand rotiert und auf einem Feld stehen bleibt.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

hallo @BlackJack,

das werde ich wahrscheinlich versuchen <Rechtecke neben oder übereinander anordnen und dann horizontal oder vertikal scrollen/rotieren lassen>, muss jetzt nur überlegen und grübeln wie ich das anstelle, und bei den Kollegen von Qt schaue ich auch mal rein was da so abgeht :D , danke dir.

Danke dir

Gruß
ganja
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo ganja,

mit Text geht es nicht aber mit einem Bild. Die Anzahl der "Gradsprünge" ist die gelaufene Stellung des Rades. Kannst natürlich auch ein normales Bild verwenden und über das Image-Modul laden (Image.open("dein_image.png")). Mein Umweg ist für das Posten im Forum.
[codebox=python file=Unbenannt.txt]#!/usr/bin/env python
# coding: utf-8

import Tkinter as tk
from PIL import Image, ImageTk
import StringIO
import base64

WHEEL = """
R0lGODlhyADIAOf/AAQABgAEBwoCAAIFAAIGERACFRkCBiQCAyEBGh0DJAMNHCUCKRwGHTEEAz4C
AwQBvBQPAwMRJAACxDQCNR8OAw4IdEgCBh0LNwUInDgCQg8A0AcHsg0KhgEXMREXBVQEBE0AVU8B
SWcBBB4XAwAeQl0AZCoZBCQbA3sCAxofBCEVZBweHIwABWkAcI4FADMgBJ8ABSsjBB8nAwIoTwco
Sp4AH38Ag5gAOwErWoECkLgADJoAbcQACKoAXncUL5YAncsAApsAkq0KAh4uSUErAsoAIDouA8UA
M7kJAMAARQI2ZyIsbdIDANwABMAAWIsWIFIkPi01Ay8xLgA4dKkAsOYAACcmxbMAqsEAgT0rXU8v
A1wZvvMAAIUQsLcAvGIej8YAn3MXt50I0P8AAE01AK4EyP4ABV4sLsEAxlIzL0kounQsITlBAs8A
z8wA2Tk/MQpGhKYmAARIjQBJl2E8AeMA3d0A7zU3wuMA51pAASNAtUI5tu4A+UZLAfIA80RLEF9D
F5M5AQBUp/8A/KM1AEVKSf0D/w5RvFtKNUZWAnNKAWpNBCpUgINIAwBdv1VYAidSzwBkuBRkjU9c
QgBnxrBHACNfuQBo0ABm5Q9qpodXBCNrgQBu5VhXygBy3FlvBa9WAJdbFmdrC5NhAIJlG2ZnZTF2
dIJmO6ViAAB78QB96WNzOAt6/UF7WJBtBHJ3AACA/6FrAGl8AGhozQCD/xp9+gCF+QCI/3Rr28Jr
ALRvCIF2ZKR0LrB1An+KAEqRY8F4AK6BAIGCgJKKB1eVSUWM2qaIAJCIQnOZFMOEAGadNoSE2ZSK
eI6ZAaOUANmEANKHAJmOY5SXP+mMAJeYlueQAOGSAJqrANuYAH6wKKWoB7GnAPSaAKmik/+YAPOg
AP6dALK1AKu6AP6iAJfAC6Wn3/+pALCxr/mwAMXHAL3KALXZAcPDwr/B69jXANDaANPNxsnO6NTW
2ObpAN/sAPH2ANn+AOLl8eXn5u7+AP7/APL08fj5/v3+8/3++////yH+EUNyZWF0ZWQgd2l0aCBH
SU1QACH5BAEKAP8ALAAAAADIAMgAAAj+AP8JHEiwoMGDCBMqXMiw4b8VESJeuNCBYoeLES5EcMix
o8ePIEOKHMmRTaIhKlRUwMByg8sND2LCfPByA0sMHC4AYoOIpM+fQIMKZfipmbh37+gt0fBAggYJ
UGFKgPkypoSmTTVoUFHN2rNksVwt+jO0rNmzaBPJuvauXj19cOFm0bCn3IZO5ay0U7MsXidc8ZZZ
fXAnnh6oWbiBMwfOm7lv3KDpGrUoCtrLmDMnlHWUXtzPcQs9mOVvVry9+zrd2/Mg8IarTUkLlgCF
m7dx3sDpHscbXOReYjULHw40kS9x897WS8d8Hmi4kzRA4ncvnrwH+9S0s7vs3oOnMZf+bY+ZRrf5
895y7+aGLdZY4vDjK3zkS91buPWasUkBwUMfdc898kAn8cximhX7WHHHag+0I1hMDfblEiDj6Jae
eRXuBowioyTDTTXAjEKKZfKVSBxnzn1WzycDAABAAAQAMEI4oA1zVzwP7BGPFf1Y8cAy5UhAYFMS
qHHPMvh0gsEo4GSonnq6ATOCiy9Yg9s43CQzClkmdmnWEkOIcx9ovrwYhS/NJNLiI2Pqow0Ge7Qz
YDtWxHNHOQWK96CQ3OHCgS5NWghlk72MMEAAALzgZJPjQLMGCg54KSlJOMzBSSTXPAdXHwAk4pk+
9LBBgAcAxuUOB0VOpcYDPt4RkxX+M8n0GkwVQBPoeeYV+uKhi+BmXm7QIMEFD5BOaixHSgjiSS2w
1NJKm3GJ4sE7n5UZgC+fzaMCVETSBFtU3MJGpAq24pqroQK4KEAsvpr3TSVNjDGGGUzAsMax+B6U
rCew0NIvLZmUCpo4soDWjIuigDbEYIN9C5XDsCWGq3q6nACAEUQIEMAItuaW2zjWxGGGvPOa0QQM
Z+SbLw7K0uJvv/1iQoym9aQY1zAvFvzZJFd9C+FULtEEIVa0/XqhOahQAAARyZDhIhmKXdhkLkCM
TLIZWJ9sgcqSziDHJbW4zOy/tLAiCbWaqsjpAOKAJsrPr/1oXTzx3HOPnFb1nAb+blCOo8uUL0AD
zZQBaMK3etYQUgXJjJPcBApcl9jBHJ7Y4nIqLov9ryfIpP3ZNS0aYTNczczUswR36KGaP8vssQe3
Q1OYHm/fxALB0skg7SIEwFSYXm7AANG4vFXwwAMTXAz7ROTETWGJLbZQMscUSighhycv+1uLKdCC
No8MAAygzXPiYPCwt01tcE8/nRDZc/qhtDtOLEoT8QxvdLhoQjWCgvPu4o1rwgcMYIAGiKBqXBDC
1ph3GRpQ7haXmEIEACCACgKABNiDhQZhQYm2eU4WLUpE907FlKE1xQr38EcnxBUuDABKMb6JAQB4
R7sXuEgLjfEYyJAwPDN8IAD+AjhUAA4Ag6xBjoFmmYIjMCcIElBQXRQUwBRcpsGytcJz9EhBACCA
Nu9tCytwW98KwUgkDgCjMbqZBgQIIAAiLEIXtgMAAUaxKKTFq3E8sIAIYOCCD2jMAEgYGRd0kDIk
AsWBnKCFLeagAAEoYAbT60AQA0CCsDHLX5noImhe8aJHpK0eQ9BArIaWQlwwDCoaqMAzbuOrYCgi
BhCo4KEoyC40jgMbhODC8IBQNXlxAQUaE4HVzACEGhjSJ0qgBOZcJgcBkOB5iqTEBAUwg2VWkRPZ
oFkUwpeOT75BXEPbAD7Y976fceVXTWIMNGKRh9u5iALA+J3fhDe8eTEOCAb+AIAFdEmyQabhmCGZ
Avay54kpXIKKsLDFDCgoB4S6jBWb+FS2PACAFIxpHvTIR1z6AE4Iqc8fpuzoA6BgDamh0xzYINwJ
AueuXFqtnvYEgsb2WbKR0esDAO3IBFSQQSpm7qe0SAUJBEADVdwCoRq8RKZAk44QLqcZj4jCAGgE
FxuRMSrx6McsRPqANHwDSh5TTy9aFIBYfCND5rAGD18KUy6IIAADQAEXbDrMJ9ggpw0pwRW6cIhU
bJBs/qLiHGI0B0cIIhKqoEXYmvUs0IQDUTJgAwQGECMAvCIubyIjhBQ0yqGtIYeD2o0mWgQBaPBt
MY24I0znVQVgUpAH/LT+5xh0EAQ8oOELeE1ICdpgCD90IZF/DVtgaSEINgIgAjEKQAcsUQvL0SIS
mtTHOyjroheloA+v6OI7KsAwEzqloxiIn4XQ4z8tUMk2HwsZ1nrIBSAIAVLVRYEZ+Gk1JuwAD4YY
BB66kFuD2MANbvACHuqgBuD+tV9hmwOiCFDZCnaAEv/ixMxUtE0IROET2nDHc+jxxYcpyApX2UDq
iPYADKDitGHNzTe0oLE8ZKhJuugl40wGgw8cwAAByDEAPqDa9VbhBm4whJANUQfc9lcgP2hDCRJQ
gAVQwQ5WWCzM/nULVcBhCoedQnWl+DKzRbcZvkjH6J4TytdMpRz8KEf+U/bAD3z4CEJmRONueHMl
awBDE+VScS4bVwUWNGCSLTKABVywOLqOgQs1oIKQB7FoPPygvxP4wSCCwAAblKAABQgCFSCx2LGR
DXq3sIUqtDwAAeDAubC4ROc+mY5rNKObO/vZj/yhZsLwIzt5q5Wcm2SNWIyiF1bqjXoaxcN7+jHH
BnCACFyABABeTV60HbK0e3vXnE7gCn4YRAkmgAc/UBoANvitLf6aPYTa4hKNdGZixWaKMcMlHWxo
0QxlMaa3fSc8/QiSrb1jzqh9bBQmqO4JdPHi9HwDFE2w6Ria4IBDCeADQqhCbGcsLyDcd8iDYPSQ
/UCFCxwzBFTwg5D+gwCAFoicCgxgwA/CkMjMHXiDtPCEJKXoXH9h6jnz+AMBZPAI8A2A3qTbAHh+
1A+83aHNIJ6KBrJwnvndDgJkMIKMeoHG3IRsrr5EwYuIqMuXen1kPw4yxoXsB5ELuQyGDIEXBuEH
PhiiDRMAt8htAIASEJhfZBPuy2xRXAEQwBLDpQUmGvuZZgwAAm0ThwdGpWE3mQ9Cy6C1S46+jzu8
b2+2MQc0XlBqVJgjGbfTwld3Q7WXAuEAOW6AECY+Y0HWwAvTNoQbbACCDIDABnUwBNqZp3Y82CAD
JQg5ygtgAzzgIQMT8AMa9OBXDdZibC6DoBMDMAUpPzRgbqso2kT+gShYpwNV3Iq8nCRgBeqAOH2I
aEyjRuEiIkxjHN+wYZV68409O04EBjiUAUQA2x5COwh8kHFDRgVxNwAGCAAZ4AaD0HFcA3J+0AIL
kAEAQHwchwABcHsJ0AL5JQaYYDkHFnNzMHMzkEEwBwupoAwqkggA4AGwpniWBRfvsC0htgxFBxNH
52ZYsQHiBQ6hYF4AMArmkFYBNwLWoH7AEEjyMkw8MEA5dgAoIGOyZXF2kF9D5gYLYIALEAIJED4Z
gAeDcAUqo3aDYIXF9wMMAG58QAUhUAAMAAJi5wcs9zL9UlAkAEQEgAPYcwt6OFwQZTP18AjhMz76
UA/bFAX4QQL+73MH/rAPy4AXRXc6JmYeWgABW5QMFQIM6fIC/OM/8CJbL1UFCqQxD3dHPtYDYqdx
flACA1AALeAGfuAGLRA+NpBfVIAvC3AFjOYGCQAC+EUFCABuhmBbXuB2Q1YHW4A5/4Ju6UICgpAK
t5AKlCAIlrBM/nIJ5PAZouAilwUX2QgAGlYP3xQ3hBEP1BEYPmJmLoQl1mAoS3NW4zAK6aIFigEy
cdB1vsRLQKBLVeACDiAAFlBorgd7iyZkVjgAXThkx2eQ+OUH1TYp2GZ2JVByvdhkYrdoGjcIbaAH
65ZQVyYIRmULloADMUIAJEAJmcMKhKcPvoAofYBZMDIMcPH+B7IGOyzUFKoELJMFAIpQIeOQBzFC
B7phDqDABOs1BkAgAgcgAPsnPMSEAjygcGYAA1cgbQKIBgwwAC2gcUKmigvwhjkwKcVnA5JmCGiw
ABJpCDYQAIpmkRnHaINQBpCAjIpEC0dFC9IkABGQbstFRZGwDnExXQAgA5/yDhTlSSoZK1MxNO8D
FSpwP+AQC9XVC7yBDjYEALGgG9hQj+sFBA2AKAQEAA2AhOtlNRZHjGOHBgkwACVgdkIGAgMwAbnH
aHjQAl5iA0q2AAJpCFRglrxIBQWgaFpJhWT3W4o1ZQmFA0TlCZRAA0EUASZJCxIWF/Tgc1SVD1FA
AH/wFtr+wAFEcgezgAuzwBqLKQEXAEOhsDtn9HlPZyvj0AvFtnAOkGMWIAQ8EJ8fEFtW0wQ9gF+x
p18TMAAMkJtecIUgIHIaV2QmEgJoYAMF8ANjR4ADwGQgUAdtkHsYp5V+sAWcMG6sEDZVJklTFHMz
hwOJZTYSxX0A8AkbFQBG8BbqgCpNEXn7gA/+cA+WdzppwA3cYA6hkC4nsImK8DSK8T++JAKHcgC9
JAIAcACkKEg3wFsX6pZoWQCv+QN1gAb/CQAO2paMhgYqIB8ZcAV44JolMGA/YJtERnu4FwS7RZUX
OYZqYE39ogqShAOYcwuC0EgA0FCCt1T6EA63kwJowyn+bPAWHAZ5/iAn5ZCo6RMTsuMNqCBHMVAN
IFOZodAkwWI1MBBEAFBEZlAFFjBETGlTUjltbblxDLqKE3CFAzChAniRtRgfQSBycAcAITABBRAA
C4AGA4kHJYAGHAelVJlfbhCXMKcKQxUBjnBUtqAEpdYBB8UK3AMX88ApAMAm+rBNhqkPoRQeiboB
kYcjsLEBjWAe0JAuHpA7ipAuJlCE44Bw8tIEDXAo9zkv+DREqjVbs8qWsSdkVJCaBviaaBCci1YG
X0ocLHAEV+B2boCrLUAFrpmVG1cC/2V7A2uRG9cFB0VFzVpBp9YvlyBJe+oykSAw6UBREJAIaiIA
VKX+D28gSrN2D2hmJz+DAZfZJNzAYkvTThQEKOBwdfLCAkEkADyQhEY6APU6Mk1wcWP3im5gfHjQ
BldwaVGUARdLlX4gBpDgCXIwHB8gPEUABvjVBiH3dgxQAhepmxlABW4AAiaHsYuWodjDLHzXSAoA
eHQpB0DUAZ5wC6wwYaRDUbszDGOyClhBg9VhfmCEAVRnIdCgCVMiRwJgODBGT1XQcAAgX/LCAwdA
QTCQhGHXr3C3ABNQugxApaXGAC1goQM5CHXAcphzCUqgGQ4gBPnpBBWpm8Tnlm4ZBCBQAiCwlmNX
jGqAd7SgCjOQLjiQSLYgc34nCH6bCX75l77wCs3+IDBw4QtxQ4PtsAGLiiNWwQHJYB7ccFbYMAp0
QAeN6z+EkHBmIAQvYgD05FYv4gDxMl+J1q9keZUB2yIFMAG2yZpUiJFqcFAaZAuRoBkuMHFckAQL
awheYHv8KYD51QY/4IrdNqxVqJGZk6d+JwfCpWVcBp0o6Dmf8SZXQRpysgH7oFU9owIlNTvl+w3m
0Bu7AQ22G7QGWK9jIAT5JwCfOzK05XYEG4yWBgK/2wI/IGD9ynZlwMHB1bWXIQLO1k9hawc/AAJQ
mrbS1ra4V8T5BZeZkwpKUEHOGWqW0Eh2WjYR5T1p8gjOcB/pUAFXQYPgi7gRA0PcgAomQAREoAn+
VmIe5pALd0S/QByvDTcA/xivOzCFG+cGbXCKZVd2/SlteBAGcak9P+UJjIAWX8tWV6OfbUDEpxp7
Y1oAwcef+SWAWYsJmROyFTSCzStJSjBuMeengwhCZIWt7sBdfLIMMGEF5ZAXVwEF7qgIDFZBAaAF
92N19ZiEWgdI8yUCQWQARTQGoUt2ELsADADArPumA7xobaChPgULrFCctGAJQ3AWnrpaVZAEaEDK
YPx2tTcBbYqx+lVggeXBFyQIcAAjDdUvKDkm4eABHnANj0BZMDkPWXA+PvMzZwA8SqMIsdALtwOE
U1O0NiUE6YICOuBHpcYCc4VowlsHLYC6BeD+Ii2gyrw7kMR6B9QIcz+VClI8FChQBUWZhI3DBVe8
yhSMsT+wABSbm1RpB3ewbnwXARVUWVMQ030ZF4YXBfMwDzEQACfwFlIwFYk5rt2iCI5hXhDgmOZF
B2fFDYozmr+ULhpDQTeNNUNMkCAQPgAQvD+whQ7q0tPmW5ksh1UUVNPjCZ4wu0LxAcU2X1hXTyaD
BfhVytNWByCQAxnXBmsnnGGsBzUXknlJAnJgC0d1SdGZvQEQBZ5xMAHQDPogkxqAF7MAIXjCGjoI
DueaKNyAJWN9VsBgu17HBTDgAATUAAs8MhbHn26QAQaIyhbaAqppdi2dX8bICYllzn2tSI7+kLx7
yndDscBGiQIiIAJPOEx8lgRbfKoXiQYC+QMTIJAUPAhicAjPHVSXcAlG5QmCMAfMVTaS8CllIqj6
4A63YwT68AqvMQv9AFIxIQ/98Dou5A2hgCiXCjIW42LvygRJCAQwAAPxUjxAgNNgB2RC5tjFnQP8
WQfEXaCtu2hocAcGVkWwcFQRpABRxLdWFhRfOwZI0HA5NgAGgAL5yjhccARgIM+rPJBka4YZMNkY
97qVE3i1IAgdECMKMAWJhE2kIwAQkCn1IHUD4A4oTBr+gA9qoAHx4A+HYUbjoAWUdT/jgIk6aQ7P
oJmtlZQC0ADXnIT4K5APWNw2gIp0h5X+WomKYnDUPpU9qiAHM7crUgRB6/wTRcRwiKLMOcZjsjVj
TaDYQU6wu5kAwBe8ryqbxVtuIRsAOOBEAKAEqrA9b5EOt6MzrwAj2vB9EoAL/sAPkhfmr6NK30AB
AmACtjEOmkBBnkfI0xxEDuBHgFRTPD2VQvYDVCp3qxwEVPqb4UxkGuqBLtcvlkADQKQuCuBEd2sL
NT0SIpBwQgsAIoAEPEDNpaa5MNUEThDeaesHQb26OWB3Pz2Glq3JcwAAM6AKnoCce1oLlOCX3wMA
haoP6YAw2iIBAn4apdEOKvQA5fkMQUQHFfINTiMA0FB/OC20AWABTACqAcACWAPcjdz+4VlapgPI
v7xIlW2gz8P1V2RsQekyA5fgCUN1aoHtE7bL6PZLMps6AA1AT22lsPJcyj/ggG0gpRi33s51C3BA
TdBzCUp9t9H5hwHgAc4xDyNAAGzS0LiQb+VHHf7wOgngDRIPAJrQGNZgMUTwDUfYwzgW9IdmAQMg
TFljigNIpRNQkbtpgBMgrGEM04F1VKzwV9Ejsh0QCbbACnjKYM0oCCQR7gvXmZoLdj8kADm8WjxN
6T+9aL47hVGr3GRHzisuBwCgAI7ATGy0vJkw2i0Ca9fp31IwIEVHdP7APl0FDsAgR2f0ji6iCehQ
CVUA8gIg8mPAA/kn8vN1A7w6ZD/+0CJ3PQhBbYAJILz6pbUeuOLyfQlVFDapMAV4ubFzmrwYxMkj
IQTywgSdafwlwwIGWPmsVcXx2u5uSnZtwHElsLbByXbFe1RpLEUAUYuWKhwCAMzBpEzfOxkAfOnT
1ycAG31/HnTyF+/Bg3b9+kHaAGhcMgIQgIGDRgYABGzYhJhhIWDAhypjuIgYIEDIGDM6rhgCCvRK
AQZoDOGxwWDAgAVUgg7Co4aTLVq0YNFKhQOAnKqwYNWyJYgAAUFWvd6KpIDEJVpy/r2FG1fuXBRN
zNjE+YHL3TFjgBiYWfNulQ8WkPRFPKbKkSt8gA4KGrRFhhYgrtR5OsiNHlVYCyr+sETLlqUIAmhw
2kRP36uV7uoZAfBo9YZO/dpttHLPX6cNocBZMwBgFDctEADQ+QaqSRUHOXX0/TvAQZMxPILgiWyo
zgQBIGxkALB0AhXIhgaVueOpq1WsMwTgSFWVPaXSSmqx8gprtPpbnpTMBRDAlxBrQoQGgOBrjCYc
COAA6vqCAQABROAisb644AELO8wrL6g2Skgggwxs8IND88qAxJZbxBJgilRusWUKAAAQhBNyFmID
gBP+AKCAZvRpBgMrOulEAgkeuGMPKzB4ZpxvtBCgAAoGAMAEYLCJwwwhZNILLwEEcEHBHrAzxI86
6ijRiwQGCGApAEBAA7JB/BD+A5LOvMLvqlvkCCCAObrSzxIFBJhBvfxoueWqqgQJsNG3RHgQMS6Q
4CExM1D4Eoa7FgTAACTMAIKHBPtqogc3svMQBO9KKDEyOqdSxT0C5riFFvpaxKSVevRJpyECRnhI
n3A4wKBYDiogFoMNKkhmHHCqaQQCg2LQxRxggBhDhAB06mvLAKbj4gaj/KCihAUWAOFUL8ydAITr
HsMjDExs+QpRW+5F9JIOBOjAEhVp8WQGCTvgJD9FD72EEUcD1BQxMx62sFuZLKgJhaUobKKBBpiI
eLHGsoPMDRAy+EHOQU6ecwv1HCmtA0puIcg0VSJRByJ3hgmHnnrc2UaaUkr+EWaXaJgRRphSdtmF
F15QgcYbbqCxhhsnA2mCCwcAcKCmBbeFYYwanKqjhAKoVCoDzPjAw41WT27DiqloEQgrSwSxRD1a
5iBAAAWmEGQOHPoUgIT4DDYYqzkWnksEjiNmvIoGcmKBhwYC2HgMFLCONDEuigBjQ1TdoAIPP+R8
qo47VFFlij5x4GRPflXhhBiIIEIccXO+8caaT6uwAAAUvAyAQusMaSME8X5AA4QBcsgMKDr1iK+q
VByZggQFxupADltUUUJCAAgIQMJtpzDrUFaqEuiS/2p/y4W9GI/YDBgECMAABwwK8y8AdoLfjFJP
RZV2bOCFx5wMKJtRhSf+CgIAHAiiIEpIRS02wT4KvgUUh7lJAD7AA0x9qwlN2IEd2pCBpWTAKIaw
wQBKUB6UxQsSg7PVFBSQE4PMKAKOsIUnppA3gyyFX+qhl1dqkYqvCKQWl5gg+0yAAiRUzUKjQkwV
tCW+rGWQQpaqQhUq1JcqJAENjskOUjJAwMjMSQzzusQMcgI+l6WCExWE4z+4UAXJbWspBwqXG/BA
QgBkAIBtmEAAWtChQbRhC5egClbk0AEJCYAAOJBDJGQEn1ukQg7WA0AAFIADtsAiT2ahBSs4EQlT
ZOMaFFQENIBRCSEsx2EQc5iCLCATAXQNCcG54mBYUJi6SIpznuuQH77+44U6xMmAfjhkDqvXgSlE
QhVxhKYckSCCAzRABAj62iBKQCUQtAEoeNhmAZxiHjqlJ5E65CEBZiCIVKiIEgRQAFuq4glLzGEO
joieV+TzFU9kohXXUA09lME+VIzjdtbIBSF4UAUoWqhABrAAF7jwASoB4APYIkx4BkCABhymL/7D
AnYMCBk/5GACJCsjHqzwIjd6whPRhOk/qsAEJ+ogCHz4wYwy4M0ytSA8IMDDyfzQhRcmChYK3BYA
OjAHuyFKDnqjhFlqJR9QXsUWrECiMtSxq9mdEnF0eAY4nGVQawCDEE3cIuMwxDEuwKABmWwQCrT1
JfoFwAKZq4IT2sD+hw6V6Qc5wAMajIIyN+yhM7YoRkxjCgSGMmEHeNgOU06IlPBMwJuaOWRnpKc6
R3Jyn6qQw6A6YDdF1cJgpr0PKbPxjtm19h21awQ3wAEOb3hjtk6CBipcULW7NDQxTcAUldpkABQI
QQSAqaWFNgcGMKLsRDt9jHnq9EzFVlcHNzgVFXr0g2/aYGwLIKBm0gOoW+jLkXKIT9zU18gp/Itw
+hSlJIghDq62dnb1QAbidOGs2fb3tuPARi8CoQO7wM9hQnjrtlxwl7aG54qWKkJITWSeHywgCD/A
zMn4UF0OvyUHG/rBACaAnbCFJwHkGcR0E+nJWzgCfO2tyvbmEIH+pMLnKoQLZSpIiQzW2tfH+hDH
wrQQ1tralrZFtq2TktEIGAAhrZbiixQnlFbmBO/JUdZrAf3KAKB+s8Nf1iMaAIAAKvxgAktpylG2
cIh71UoV8bGFixVACap4Yg4k4CEApmAoT3alFpzw51Z/POjXOgoVsvXvkf1bWydZQxdnLTD8JpU5
LlggeA9rAgxQ4AIk1IQLR2CueYDCB5PmwAZU+HKq3WAHG/QoPG+Kkx2kIhpK+I0EDdweDQCgBEFc
kof8koMRTWsVrG5CGT0edLLz2yhd0BYc3PiGOfjb3yI720nACEQcGNtbA/eFCQ2opRl4YOltCcAB
LKAOECSMMmH+ZqAEqYb3P0i9gBAB1hDouVckcKCARuqtLGIJXyM1ueeqinLHqkl2a+tBD3GIA+FB
DhAdpjEObqAiD0TIQy9kW+RxTNvIFLcGKOLQylFBkQsWa0DVPoA1BwAmJw2AwRz16hiSojre8NaO
HqEiBjbrkN+OnIEcdkgCT9gitOEjAAmmgM+phpIT8hV0wu0rDjYshQ3pWEijQgFtRcxoRgPQhG2l
bQ2oITrR1yaEEJiwF1giZn7h5oEBGrBQHRzXh5AyA2PAaIib37xEg7BDZi2ha6ALouicwLMlakWJ
XjuCE3ELJSsoUUpkS92+8xDHJzwAgD7QYx7LnktBY0ElGq7+BBjo6AWUJPQCVHwj0bf9Rsi1XRNL
weAAV9SBAA5QKZsAQQR17ejmNLThvvvdDVYouiBKw685xAdGyieAI6jKHqqwAhOZIMY66jvoeUi9
HrJYyo8gLpcXAONJ4cn4KE4AADJoggKZ9LoAFLHx1zsJG6iIA1p7ywXGkuqtFmACvuACIbgfADgQ
BXGC4uu7MLCTsCgNApgCeaqkGRsAGiCt0io2ZUC4ZBMHUWCDKGCDT7iG7vsxeoiC2OAVAIktbICA
ACCCaBuHXhiBLwkPIiCDE/ChXhiHJHs9sfoGaBC5bXslM3ABmWgAFqA9xfg9DaqJKlDAvouqWNGb
5hMNW6D+BBzIGwWQPtO6ij+LhFYghw1MtnnoA6/TKBmQBTGcHVEAgCiYh0KTi0b4hmQwjjxwFm8w
BzrIJAjQBHQwB2xQCQDQAqkRK5CLGv/qOGtABUh7n4c5OfqxKB3Yokc0ACd7wuKzQn7jijqDg0ER
gAj4k1rxpEuQhF+IOoWbB3dIh3cgQX2QhfDxgBTYqPCIgmvYvnnIkSioh3oYKLkoKGiAAAI4gWYZ
iRdYiVjor3EABuMwAdcbB2igAy14gRfQAkVAhWdAtI7jBmAQuYX6KC5gAQMIHwH4ACHYiyY4gEp0
wku8uQRSAAVwpku4JPEZgtCgF0yIhE1YLR+jh2b4hCj+SIFYTIE+EAeIEAc2kYV3yLzNCw+CfId3
SIdHmJFEMMi5AIaO04IZiYFFoIP3C49gMIfa+g0TAIAR+AZlNEYznBEIIINRsIaO88GQY0SbQIIP
kImccAC5EgDDYMfiSwUZIYEZ6ICkWir1MDgwVMN6CIdHkEWVHIsUKEh6aAjZ0Id6SAfN+zoZiAIq
IYAUwDp9UAe5kLjZSgaSDLgZGYHj8K9lBIAY+IYnIYABMAEKuEmvC4AYQMZE28ZKiANXqgIYuJ8+
WYoDcIGeVMBbocEOgANPsL6sWocfmwdRYMivg4AoeIREOEFdjIiurLxwYAMCMMMAkIGChIh6kAtF
SMb+XCACCMiJEVCEXoAACOgFczAHblAENskDc3gGAZBNbFClUciDF2jBlWyEO0zGHxS5TlMMGBAB
C3CAcmwCwyw+TvAEOMABvkkFUfKnMBy0eijDrwtBcUiHeei+d4gCCMC6ZliJcLCvd2iGRNDKPmiG
yuPFuNCEHWS0bRyFUYAGJ4GNERiFWNDDNpnNXhgAIug4cyhEbtCF4JwRAYgFBRUraaPQbzCrJnLE
5VhH6ew7VYCRHMO+x7yv7dOHa/geCBCFU7yvrSzIdwifT/ixhZsHEoWIbIiLWOAvHjQoZ4uF0JwR
OlDQXpAQjTu7cbAGTTAOLVBQbogFRaCDRVAEXYD+BmgDwjjgAbvwHw4tPsY8olJSjXlIh2t4hUdg
gz54BF9AuE9oQxWdnXd4haWomXrIzFa0vIqEi5PowWQcByQNj20hg5PMHWNkyVGohpM8MoNaBABA
UNusoQeFACLQBGuIPV0IBCEAAi1VwEz4BXLIB31wh2bogxTwOvCJy0TYFYkMFtcKB1FIgfCJAoST
BQ+QhTq1L3uACy2ABmozMiNLRmDQBDp4TalJslEwDgkZAS3QBGCY0thLVDqIQd58ASKYQa5cCbC6
HWgIBEwtPu2rymaIgrOszD6QBVloiB9RzygQz3DQBlmAz2CcERlgz9KkU1rVB3qAC4njwTx1Nmn+
21FnE6tYeIEaCp8AGIEYMIKAlc08BABN4AZrKCtFIAIToEEIwNFv0FYFhIhXKNYUSARfeIcNvIYA
oMh3MI4BSAHWPEsA8IBE+Ep69bF6SMVVeIuxFKvXsy2RFMnZ4tXbggZNWE2VfFA6gDaVGAV+BYe3
hIZQIAIqiQFsvNjiywdtMA4IeARtmFd3eAQC+BF34JHvMcMUqNp5pdU3DIdm8IVjiIZuoIZSeIs8
MIa37YVkcNhC5YZ8xU9dzVlnsYZggNgTiE0IeAFFsAax0gQAoIBkNdQERQdXMI5YsNinvbl8kMgY
0AYSnQdt+IMBQE+ImIdXYIMYiII/eAVtqDz+qSNPVdSGsx2ac2CHe+AHfvAHfBCGt9CGqqQHeniH
cNgGZ3AGYwiGZEgGaMDGaUu0nF3QH5RbSXU2ayCClTSC16wGZ7kdlUAFyC2+MhyG+3oHbRAFI6io
V/CxGbW8enjIcAgHX5CGoekGdpAHfHjd1/WH+IVdf5jdf4hX+9rF200Hdd1d3wVeqKkGbqhbfR2r
RHsGOijWlTCB59UERaAAE9AF6+27YQCAPxgGbRjTGBAuAEiBYaDRGCXPdEiHZhiG9I0GajgHeXDd
+GXh+WXhF6aGt2jZ8YVZ3A2Ha+Dd3o1b4Z2GaTC7POWGXsiDtBzVB10Ea5Dgm3OHGPg6r53+kSh4
hdL1sdz1hRKOhrRlB3jAB/d14Rf2Yn+A3S6O4X+YYZeV19uFSN3lXf/FBmuohh7ORoOKPQE1AhOw
48CNmiSON6VkgxGIzRj4A1GwWvxNxXTQhmFAW2Zg3faF3y/u4i+G5Pg9h3PoAyk242TD3XQQh2bI
4WCIW7l940KMPWiY0tvR43hzB30o5HRwDc5NxbIVhWNghm44By3eh33oBzBu4UjWZV6GZHagZLG9
ZFpdOIhUB93t398NXoedhmc7ZXjDOpgl27KVBrSlZRV2Xy/u4jDuZV/25vhlB2rog1Qe5nJ+2TdM
Y23YhrcNhmdONWlohmaw5vVV4UaW30f+/uZ89mV5EIZHEGZ6XbjbFV9zHlF6SAd3/rJdYF/XtWdH
dmh9hugXlt0++GDL60fMjIL4fIT5bC2G04ZriOdrUId5hUhxCIdV3JV8QOgOY4Z96OZ71uaI/uZb
9uJbtukt7ueK/jGFrIdmmEyVHAB0VWVZONmz1NwoCBZxSISTXQoIkIFE0AaVXunqigZ8qGl/sGmb
jt99kIeuZod9wIdJPgdqoIYtJuuiEYZz2Aej+ZlCEIZ9KAW3/ur4FYYVkAK7XgF+7oPO9QVfMFu/
Ntt4DmxvfQR1yCQPAME+6INEYAMZMA42kNwAcGoQZIMPlIGluAbzrMwyrWxZ9ICp5rD+qpZoavCH
uC6EQpCCUvAHdrjrFXBteWAH1x4AKRiAc8AH1B6AFSgEaljruM5t0mbt1lZtoKGGQmAH485pUTDq
pXCTpWgTAPgE1ojigbZdcdjKdUiBqyPPXZzR3PUANhAHAKCvqtzFnv5s0FasaJAHakDrn/EHso7r
c5AC+hUGLd7i+OXnASgFKTgHfzgH1JYC445dYUjtuV5r3C6EfZBvAJcC2RWFqizDPgFNoPW6TxCF
AbBkiPiEASAHD/iED2aIKCCHAZhPnSHPd/AFCEDv9D7uAD9t1Qbn3S4E+mbvosEHeLhrYSiEUgDr
1JYHeAAafyiEpUBtHi8F3aYGeNj+6vhG4bWm6KqsukT4hEe4zESwcip/BBkQhWYQ2cx+yIfc31iF
gHWIclnoa7N9hVANgFegh6pD7CiAc9aMgnVYcZiKBlu+Zdl94bhmh9g17Z8xa6um6X2AB5fe6tVm
3Sy26vv+YkPH6pyGiHe4hk7dxR8DaRM87BRIARnQ9IqSDeuuqO8BTclOBNVwUzYIyFiMgk94B9Os
c2i6cxfmB6tmYZrWZVuX6Vx/9EfQ6WR7hz4YztBMAVEgwXq4BlH4gz4oU1HwBRUl3y+fnXl4dViX
B4jGZ/jF53x2dEh28n823U2WhU8Qd79u9RitdHq112mHI9F+YW7W5/nNdne39kf+J3aCtvfWyod8
ePZwMIbqVfcKSttFbt99wPaY5uZrh+RcznXZZQNyvneXLWY1DgZdAAVCGDkkAIJL/XcK4gVg0IVe
6AWlueJZZl14GHiC/2KP2GUWzuVsz2d8KIVxfviE4+53WGdXWMSLv1ItMgO244no3Pja4YXbsq1p
eOOy0gVdiAVeOIVTGBqSV2GCl3VtdvmXXnl8kAIynnnbhch0uPmKv3gg0NBG5D8YYAG5YqIq0Pig
X5hms4ZQaARg1QSmIUSK44YengZV8nilYXr1ReGFzuZvbuRGloc30Ppyhtn99V1d4Mv84wEmyKKH
4baPoiMUsAADqKvhQje2R5z+Z4CGlPS6ARgBSAWGAf64mvUGisP7Z/D4pWf6XSB59t1iqYdkbmaH
t7jfZNP3fDDor7d4SxX7LHofnvAtnqhJzO8TCZG7tzIAGOD8heEGPTQAE3iBGTRDCKCDXNXZIkVE
sRJgbnhjaEgGYHD9pof9v2fkF779f6hdhSPf/XWGYBiFSnCBkeMBxuL54o8fh7E9wDmADwAIFkKA
MGkiYoAIIP8WMmzo8CHEiBInUqz4z5oJCrqqPQMWSxMREwMAAHgBDBxKcNysQXs2jRs3b+BkypxZ
MyVKc+NiTgOmC5UmRaeGCusmbKGsd+KcGUOFilAcIUiANKnChYsZM2O2ah3+05Xr1q1VgOhA0kSr
ViYNABj4AIMJ1rBVDia0aPcu3rwM0T2DACHWt3GCx32D1osOBAB0UHJDBejFCAgmtCgCVm2czZTj
at7ECW7nN2vJggUT9e/NwgZRm/CoYjXr17CyZ4f9CkTEAQACGsCIC2O3EC6yzVRBIkLAABZV9DJv
7jz0C91kYln7ltOcuVEAtHzjtmgkSQAjA4wgEquaZ2+dbar/jBPz52p/Fn44G9sr7fz5szZxMCAA
gAEIgEIVY7AAgAhdcdEEEig4YIAAAFhwlnMVWkgRNt6M08sJJAlwAhma9PIMN9/EIgARoSVmwgsn
QABeeC/oglJ78Hl2I07+Mj0z3z/13afffmYIoRxYvw2w24MBDODCGDzsxgIMKIjQgAAAAkCBCE2M
wQUKF3r55T+6VGdOMoiBJwAEL5BBBgUAjGKOJttBY001ycSiCBEQRAjAX++1R+ONN8EHDEMGaAkk
ollx8QEAQtSGggACKDeWBQM00AQXInj4n5UGiIAEcTVkIQiYpTqHRBygPGPON8kskieMBGxnzThk
ELAIdp8Rxk0yo+RZkjXxjWPOnzS2d9NNujSEBKK1DTcGDDqMgUIAKHxFrQUFbgVEbo424WADBzRg
gQgwYArEE0tckootnpj67l1YLQgEIblU9w0woyhCBxl0UPcZHQRQoAn+ejYOa80oEBDQy2eKxBAL
NzamNxNKmI0zSkMwZNXsbFxU4YAFQgrgAFZVGIQgVl2JEAALaI0FhFVb6gCFHJ7YQosqqagCL88T
xeExVa4BkWoy36DD6jeBybThSAMQoUky3LgHjjnoGCEAKuZY8wIBAmhRjTmB/mnNNN6gs0hDKMSV
KHFAuICbAAeYfICnIlhwAHIfCBcWCwEk6FVXZqCbhSO2pHIJHDjQMMUlxfT8uENMCHH3ARawwENV
SNR7mWAUf5bHnnwSoUgswDxjTTAmCABMduFdqUlgOVJszQkmsE5KQx9oux8XkovgQJW6HQnEosIP
wOmlsgnhAAyyVaH+gw/q2mJLJFMoEGmkHVgCOff/CIEcckp6CgRxqIJSMGYyfTOK6q6j+cILicVA
azWIBUDSAFqcBGjFsQwAwZwc0gAg1EYrCxICCu4WPiWNhG7WYsHxjmQAB4jABbvbUhW60gRRWYIT
tGiXEmQVIRIoYQYAwMElutezufgtSg4QDwAaQKSxCKESwIhY58YBjVEYQU8kuR9JRjCjlMQiBv+J
EAQUsSqcmCMPADDCOJLxEEdhkAcw+ACVfgigSDWgXE2AQct4YIEPCAQuP9oKF4AQPUrU4ha0SIUg
OhApAuBAEJ64hScUEIEUqvBdTKjCWhxlhiawAHgC+gAT0NgEIdT+qzqdU8kO6UCEF1DACHRIhmfG
YY1GJOY/A3hBLML2GW5ERxHjiMVD1CYk4C1QQLspFxIyyBXhEEeWQKoCDKAwB0/UghawmJ4cricA
EswhFbS4xS3kEIA9pqKPpYqDaxwQAAeQzyvfMgCAHJBINI4lVcAIjMV2shJrWCNiONKhFkInADqc
RIcv6sU3cOeQLI2BkGsRUOVQYJa9oeWMgVPQBkfVS1r4khW2mEPXFKAEmxE0FVPoGg1UQQt3OdNL
oDIDCyLkgOB4hQtI+ECERLA7Ay6SEGKKnWZkl5KlXWwEPwTACDTBjVjwiZxocwg1AfetA3yAB2sD
0sbywwUe+GD+DpfoJSx86UtYeIIEAtDezWBRC0qYUAARiIQtVKGHil4oCEnQ0lyQ46ltjqEKkAKA
tMoKA/JlpTipgsY3wnasHK1Hh3SAEYq4pgVeRaR5YUljNZsVm8B9EQqCYJcbG0rQpFqCABGgBDIn
KocIZM8S7dqDG/DAVeegwQ9+wAIPiHOckTDPPlVgFAu2dByRBq53jLyhxChWLM2YyAhHcp0mxhGM
iKiNY84Ci2zSGD1HpCKxb3SEHKYAB0fUwhaNJQG7PCGHDugmADO4xC0oEQY8GKK7m9VLG/zQXUOA
oQhWgUEDjjcyFgABCIxq3vcM0DLgesWtoHCkbGf7HmtoIjH+4dEFN+T5kPr4Nqi0waUuPXHMxapC
EDigboQUMAVVqAIHAcDBFEggIAB0oGa2OEQXBoEHKtjgB174Ll78gIYfUKEOhmjDV8dwm9wc6QAH
mCamGCUCWtJXLECo4Q114jkcfcYcwCDDiqyBjYmAyre/rScHjblUWKQiEjPoWqQCoID7wcEWjqBs
ljvAuFuoYg9l8MMPJiAeAWSACii2CB5aQJICLCAIIu5BaAU3JQPoxgHSQgKEmLWf2ixIc/aK3Xoy
ibARGOEbvZgIC/bmZJn5gHHFXSxBpStMAESgjogLQAfu6IgpKGEKu/zgJdSABz/I+UgTyEABQOCG
N0uksy3+GEAC1DySFrgYDEcoUKFhIAT7/OYABNwYE1BAQKE2YWiggCt81lMTzEADGtxwxUREOujf
VkEIo2IoLMId7ok6NVIKwAEljJldBRDAER+8hS0S++Ew+AEPJRAPA4KAhzZMQABe4AOtH2IHQ9Rh
AQWgAh5skIDjhaANL44xfTEqAAOk1SsoiGFveoxGJmgOGNYQcrHWA42KLHs2g21Cuiwh0aSOO6m3
4AQOdAMAEhyWoFmdAkncLW5fquIQZRiEH0CgpAVQYRCGQAMDAEAFQwwi4AzJgXjbkPSlH30Cx8uA
GwjeA+IVEFp5Ix4uDaDehJh8OM1+a1wzY6zPPJoiLvD+55Z4QLNLEJQWtajFzpNKiykciQATvtkx
VRHCp9Jd73i8gxuA3uoJoKG7QR8AAxyOhx40gdaS8IQe2jCIgg8gAy42hBtAgBwQfL682tpYExog
oC5+gAITPx7GL8iVoKYRBoHw+COnHeCKaBtwYQkocResd70v1haUoGwHDkt8S5CgunNQ6gc5sd3u
/kA8E8g6021QgAGUwLM7CK3JvlsMWzBVDS7OAUlKwIfuhv5ILRDv0SGOloyuWUki0MFx7icAej7L
wPVEVS7A1UqNA6FYhKAZEFFJT92N21K9kSAclvEpAAAIghv90iVYz5EEwBQYU1KlAojBXxsgAOR5
QXf+DUIObN8CkOAV9AZxNAETcBUlxKAq3MIlhIGIWV0A2AD8uYHVHdx41cHWfYVZ4c2R0BMXwADw
AIDubNtsjAUMqIo5nZJd9FYViMqpRZW4JZUnGJMnWI8CQBYlsNslTI90dYArKYAcSBke6cHPjZcN
jISddVcOMMAAFMAPHF0NeIyDVI4LVF73FMMcaNi5UcKH/ZwXLMCuwR8aIGL3MZ0hfFYRSJpHoQAK
CMEF/YYBCMFgjUGDlFzHlFQuYAM28EhFfIAQ3MASRIK6sRwDThQO4MB06YYA4AC7xBwOzMEUQFiE
aM9AHY4aYJ8jggD3wd8J1mEOENwNNEETgBQQGQD+DIRfz6iCLQgCAICagGgPLehB1lGBCAKADXCX
IdgAAEzA543XFfwabPhecNGFpOHHaQFATt0SD8RBI+AFCh1TFg4Uy00UZXmIAEiYB10CmMkih6Vh
3X1YF3DXIBhddwnjMSbc9hXAMfrBDsCMpgTABzQIPJ4FEoDCu5BCJMCCKjjVQslB14RamTncD9Ah
AJRA1iHdApTjeLWBEzDBV6BFWAiBARhbfsBANe5fO9IGcTwBXkyBghFfuOFdUtXCJSiBMAkAHVmW
zTkCDiiAAnTADMgB3RHUGrZhCTLkD9BZC2SAeCDADxhdEASHC1QJNZkBDAyAARBPHNDKNyyZhRj+
QzCMwzRsQi14ghzBwS04lG5soCfQ2yBQASIOwATYgDCWgNEt5HgZAh6AFi3FRhVUitosUoHwRwO0
RdwImn4Ijl7oXCuywjFJVwTIolUV02K5XLtcwhbGW1LZQqolXneNmA3YABV4ljjCHgiggdGhQR4C
wVoYALOYAQoMwAH8USV8wzSgAh1QRjJYA15gQ7CMgyJAwEmQwro41QxIYyrgQITMwS04QogdHQiI
x0hg3YsFQQ60WGT6muxtSQKRDwoYgAUEB3ICAAo0gQVgpC3RxhHqxQZOWbiRmSA0H+yx22ORXxa6
3AftnJd1wef5ARWEgHoWQAusGonpJji6QTL+msFB8KdwMMELZQsQQAM2aEE1HgkZQIMmOQM96EM+
2MM6rIM95IM+0MMwVIM1aAEd0Ip25NYzMAIrKME/WgJBWcL1hFohGp2FtkAJ5EAdHGa/AUABZMAP
gOOLOcFZfKLg3BgAHEAFiQsB+aQA+FV+MMEHMIe7LZYbWULMYQ8dUYIyTYGB7tyUkRkknNltttpI
JEABeON4MaQh8EFFciI2aZNX0J/axME3xIkA5AH7AIAigMM0GEM96IM4REEKjEAfqIM+6IMzVMM3
EMGsJAMEaAGxnAIcCQgOSJQtICkAyAGZaSNkQqYheAECAEACEMDxFEAJONxtUmZ+IIHqKcn+nlhL
WWnKhOgHDDQHHEgZbVpPhFQJzbELJ5AAAQhCnipVuF2WbRLcvR3PBPyAG1Rf5JXgeKXlVayMM25F
6gWAsTWBvUTHC0BDEwEAEYCDNWyDPryDDABACqQAAETBO+iDNsDoIpCEFmBDSGDDOOhCJnDCDPyj
INzMJchRBxRXKqhaZEpmY7oBFWQAcgCArI2XH8jns6TRfZ5sDFlQk0DIfDUhUTaHkqbCdCHHSHQY
Q32QIBBARBnolNFCqnEpHqTnf4QA9iEdANxhZHpBpNWT6mmTGXCJbojUXKICcuTWONBBSfjoNtTD
KwCADNCDOHhAAMiCPqQD6/RClUBAHuT+wQDEgl6WAiwE7TApmGB2qxvVoKGCXtIdI8G1WgCw50wm
gU3+lkdVinoKQH5yQUYNkLO4ZYUogc5crIecmxzMARzAgRyErgTKQQNiWipAQhfA3yPe2kiUwOcN
QgvcD9SyXzJuxfdISlbogNgNUBWAwjeALQQkA6toAQEQATdgQzrQQxQQwCPUQz30AQCwwTy8Q15C
gwmcQB74haXKhCukm3gCAJ4abWra6jH5nKG6wcKBADj6gfYdD+lF5mT6lFAmJ4Sop6e4wFrsWDou
o4U4wi0IgjBxCvZgj8zFatHiDBsa6iBU3/E0YnddwfYlALFK5taFxVvy5DLCZcsgQTL+WC+/Bgbt
bIcOucM7eAAA+MKolm0KvAM95CU4IFmZOGzEFCksCOQ/RoIbXewUOKhWZZ3R4UEGjMQxQmn7AsD7
RSYfmB5+oIUQuAULpJeyGgA2GecS68CFGKUtyMEMzMArzgAN0AAOeDEJ0AAJME5ropoaaJ4jHt3C
DYD6jtciNrDq7kDFjcH3HEBrnJVIVQEhmIh4aIJOAENiXGow0EM4HE8zjKov8Ik60IMxfEZ/AYYT
UcAzYMYpcMItINRTUcLG1qob9VKZ4QFkoh/kzS77iocPhiyMHYqCvAYQoEBuwFA17pi8ioCXeKvN
3Ywus4s05swx4d1U0luhZt/VlSP+vx3PAgDjFeShbGQwyEQIgfFALpiDIvBJL2BGnARALICDpjaD
eFyDIh+PONTDNnCDka0TqxgBBQADZiQDI7wRzv0jdZHAUdqd0QqzZAbxACBA0TleCchxyFIw1wml
R4HUkWCPxkjul+DAUbYipiXWUtpcAge0HwRxAjQe+1kd5FHdiz3BfLoXhHgKWM3l7wKACaDHN5DB
lcCVM9RDMxwPOOuDNw9AOMj0ZWDEC5gzN1gbZnDDJJimznaAY6FbvLVmdnUBHCfmBHB0HYTAAMRk
QD9iefHTfeCSBVTJkbSMQoDJHCjlg+YpA14CZgXueOGB1bUAHGu0RJZ1DySSVlT+AQ9gjsfoAAzI
r+CAwvDyqzkng0uRwTdUA8A2g5LEtC/8jzjoQzhU8jfoQi5QjMHEQkhmGidr7ANupUgeAjBSAR3i
GkdXXwL4cFS3wa8hCiHlhgNgSg2UynWBNQOGm2mqgiNMH1kznR/8cwlwaBsXgA52F6JKS1YggQVI
cQP0J+AYkBDAqNUoxrCMAnJs8zQA7CEHAGEDgAfUdDhAg+doSLRpiDVIQi8N1ERNQWpyWFeHW5mV
IzceDwNsqSFUXwaAIx5w6Q86wUDrx21oIg+8yxx40IPq47j1nJ+GrGcxpBckHQiAwPbt8+wawgrS
EgzcmCsJAIHpVCXExDg4UYr+QGzYEmBNp4MHDEAi68MrEIAHJGw6YFLFgEMskAGKpwQpeMLOecLF
6pHMFWh24bOVwl4GlIDBEW7ovXHgQmJQdkw92fK7KJ+e7lx2jXVkRumBt4AP/0Ab1yEIeIGhCqe2
IAGNbRQM0GzgCEEuWEwvvAgZoGqfbEg67OjAsq0+iMLBzkPbBsOQga0rbAbFQAMjDFQWa5kjUAIO
dA0ByAHe0aYNwjGCR5CGRl0I3E/36ep4sSyQKDS8LFTLZSHO1GCVLqTR1UG5RlAC2MBCogFjtgDC
we8N2OQgvZClEFDqDcASlhUhBMvShMII3M8IjAJ89ELC1sMnRG89zEMUAAD+m1Ov55zSAOTBdoPD
JCjYByHpHrXLnEaAkn6Q+aosFZQACJTAD0SdPo/EgkcmTX7psT6OHHgQ0SKk6kLpP48EAyQADOUA
WesqovJAR11cAGSiV/DAjWWLVwDBNM8EfFgDMKACjPZ0MMC5PqgDBARAHwR7CojqjhqD1FQMNkhG
sOBEL4RkLYQnVCppu0DYDEhZD68xbe9gEPuqeICAeM12/A45ykGOksICK8wm5omBprPrFcyZDbSB
GxTjAmA0yXcXGLCgjN3YgNBSRvmNvCDBx6FEXc6JXNUENwTDpuqDS8vA/USBNoyq1Q/DxDv91ZxE
e7BKIZjm3kVK+NKC3gL+AHlq4R7Id2SGHklUudVJcGSSNcsqSLRCDg1QwkHWJtMF7iAIIwAQLjEX
/hpfeQ1oS6Zk06FcZlbzR4VTDTDQAQVIxiLAaEpkatWPKj28Awtz/ahuA61oRpzk1nvEwiUklSNc
zx41VDxDl1LVYLp3FxpkgJKoL+zWIdU9ZkDDGFnld/fAgQfBNo4LuFMXgMNpOhpsX6OHbB2celhw
y72r6W/QK1shATvrUIcEgA8ZAXbLhDU4g+iXf/lvg+a3B9ymiGd0N1DLkQBMATAfH1RmrN753DCH
40iAALFWH6E6IkAMEmiIIEE8WHhwaZLmX0OHDyFGlDjRoSBPh8QMKrj+kaAfEAMYeCGo0QuAASX8
cOSzA8kYl2ZYAAjgoIrLJg4CCBDBZUwVQtbATaMjkw40VwIANBrnDVy1bfqgQq3XLFEUNn181dOX
Ltk4cEybvoAADVxZs6Qu3aI1B4AABZFuwaI1RYAAJbZo0YJl65AbjQXRZABRp6CXAgBacBypGEwR
FhQhR46sogzHv38N2QAAoASfkS0GAMihOAgMni65fCAAgMVLFAICGNAxxgyQXGV7IR0BzBw2EwSM
YCtrLVxUfeKiBNisPMY7fe+CmS07jo6AWOakj4MmR64nEnVx1Mp7KYIAEp5o1ZKbag/hjXjcE0TD
IEDixSMHFhxERXL+f/8P3dgIs/zcQCC0FtrwI4gCBkgADY68qKEml3qyIIAGmHAJCQPaQoEnLoSw
Zpxx8tiMjm/GsYYCAE74pixo1IkqHQ9M6qMZda5pRqpYlmLKm3F6yYOsr4gcZxJWaLlFEAUEIGCO
vFJRQoAOUtErr1s8CSMlxQBjMLHL3CAsP0MGceO/M/v7IsD8NBpIoCAYCG2BDBgcwL6C6rihCTMo
rHAAC7gwowkLZ2rCpkpQtMaEACDoZURoIADABBHHScY5febpwyRZjIuqHmOqkY4pr8Ah1axgIpHL
FikB6MARteiiMi5W5KLlkC4GhNBLMgvKAQQ8yGyzDjSJjawLP3L+VYyKCQZodoAAQojPEDx2AKJP
1wYwAAYgRHj2gJZoQ4KscWLZ7AUUwdEltBe4wY0eqN7ZzAN3OpVqmHbL8gYscKwZBRhSx/mmEPVo
8a6tDuQQhAQApsALlodrPaSMyzAzxLCTOPoBABvanDaMYkGe6AdgC3LDizbqgK8NKkAwKbQSAtwo
CCGuPa2JD9oyQIABDoCBz55+KlWRzfIgtZHNtCA1mHmgEic0GZiuVx9nniFS31HLpcMrfcFx5RIr
L5mhrQDIxiGVuGqtVRU92hhzIDQYBEGgNm0YYAKS8RAj5L0jouKyFgBYYIIJFjjs2QZtILmgK2o4
zSUgUBCCpyb+UDjAgAM+0OFnM5DIxatviGhrlM+12EyRpaYxRqutlPMgHan10QYYs65mCtIXRCTS
GkbUg+WWS6boQHg5PLEFYlhofbjgL7a8zBA3FgCJCl7xyGCADFLygz++uXeojOw/crbZzRJAsOLn
nzCUtjG4ECEnEYAwQ1AggAiUQi7iACpFEwCAoCvt+CeAf43DKVGhBxs2IwNt1KMeUWva7PZFJND5
bzqlmgQn0JYXTlyiSmpBUl708jBW1OISYXDe3ErQrAwESEGbsYEh/PCD7s2wIVRAVhBAkIHBCaYF
P/CLYvDQgwz1qQoiQEoADoCCPb2ET/IDAihcpJ0RAOAFoSL+17qAAg5oPCUq6kCgvFIgitXpQx3B
MJW+RvQNIwBgdNJJRibygrwk2cIWnqgSxAgGwr0IYmICMkQbmDWABZQABAyaQBssRkNFrskQfMCD
H/Bwvo3wIQizuZYZqiAEB4zPATCY0OaQUDXb/YYI3BgHN4YCgNPpCxivM049tCGKFCjnEcaBzld8
BA5zxIIIAxCA1qTDjSMdjxapmAMJ5BBHVaWCE3KRy9pixhFAik+Q0zOTIhWJho7hR5KGuIJprtWn
JrCgATsTgAOs9bMmIMos1ngBAIzwDXMkI1IQ+FepeuHKejVjM5yKijuCga/paOKXo6DACbKYL1fA
JYTGJID+ACLgiCvZghJTWAInQkgLVagBWHMrCB5aMAEGDFKbaMAmNkHgheZ5VDFteMKEwvmzMQDB
AuakWRN54DmzmGMoAhhFMkI3gFUyJRiXqpcvZOJPqNDDGS5q5wtGgI1vaGEAjsJlUyShHlqthUkM
S0Ud5VAeACQzhL8zYbAEhIc2rGl7J8XmD4M1JoMIMZyXrAIMGvC+T1YhDvhCozVCl5PNkCFUZeGG
Md4ltVcQIAA68pQzQjUqwLLRGiU6nXTAgRYraRQHdVFAwkhAgAgwaQrKzIsj+sglwLiVtXCdG2ZW
Aq5LoqYJMKhpaBzAhCbWBoq5HI4iXmCCF2gCKKNKXWL+6yUKmTg2KtuAhqnAEQsICEAsMWgjkbSY
ibTRwhIKMEkEIkAAJVRUAKUN4TP7wqs2/cUPJmUta1Wq2m86jkKCEgIKRNCAzfjyA9ZaH4iGVKpq
WMMc5jilNQRKpNQZZx6ieIQoPpECkzAXKuEgy764AY1e9MIa1nDq1cpywYxGqS0QjcRX6VLa4z1z
D4oTUBDeG+MruJggLoUpharAAgcYIAChaYsDXFCTJo5hnR8GRyNeQIdY0A67TKmGM4yTjtCEhrED
IEenuEKqfY2oVGcEC6pqRYtLLGxnHSieLTrbsPM+DEtq2FJB/FCGGM85B9LCg57C2QQjkg0AB3CA
CDz+KdOXIOGeZQHdZojQZa6BmDivbMY1xAFpSI8RXtHBrnSqoQtdOFU639hEKpRHCRJ0gAChaRia
y2u8NSfpErj6Cx5yMGdZ11kjsY0pCmQigA+wgAdLFLT8fGKNXEJjRapcCu1ADI3iwI7Z9eBRBL8S
ixOYQAvFNcuIXEEJ5dUiFaqYQV0IEIlVlTcua1aVxMjUhi/Imt1hQIMfvilomxwgJyi4MW1+bZtj
4xM2A9CFqPLFlGTECHbvmIcDH+vXdkLgBdDIHVjAMo2sOtN3kejqDFKRYr30Lj0hXJsd3LBudo/c
Bk+gL4VgsLMP3Ft+Ncvf1qwRixIxitP5ol0wkNv+qXd4YAAy8EWn6jEM6JYlGQIgAjrMseirgmMV
GE3PeugyAAIIYgmpDjMtWDFCVmBJBSP3ekOUeOse+0zefZJfE0DxFa/Eollki4GIkn7prywNdtfY
7zrq5YznQleNAKBDQgP+lWREone1ukQHctIBEgxAxRS/Ei04kYmvTx4F9TM7rgUghM2VnTZCCLAW
S7cZSRFhEbrQ376MgXDjJEImKVC9Ppx7Va5BgwjUtWoEmdKKKplWDm0BwGrkoBZYiGf445HD5JH/
DxaozyUwCM0H9mQGLvDAv0QkxDdyOY5RKMfoAQTACMggbK+MYxiwm4cMft8HqYVjdnLnlyIGsJv+
HmEXSJR4uvI80QHfMwxtziymIJIvANcgfmzCAlajAVAABT7AAWSLQoCg0MyiRAjg7b4BGDQhNChg
36qh/KRGHPaLwqLiHazK5r7CwDQBAIgA+2yOKbhh4o5HSZiEbMzrg1iBEiQvAAPwDDyJNmhKJnps
AFbuWviqsNrpBH4vDwzMHIbG2MDiGcQBdpQLAFxHauhhFKxG6czhdgQKxDILo4gpFTqrLchqPSyB
EXDwDBvC8sbJAhqgAURAt67liTCrUpCCjQJGEZCCDkypy4DhCetlHqJgM/qA0gzIGBKsnRbBCEbg
2SJoRLBBDnZPeW6hu6ZEENQiFSjh+NBwE1n+IH4wqQma4N7YBwaqJju2r3+g4RsWATb08NgETp+M
QxwCgLGUCujuRVSYwhroIA8GCOLK4hmA4RtE7LxowRbkYAq+JhU8AQA3sRn/4QyEoAo2J5yqAFFq
pyzIAGmsAQ8BIA+M7EeKSrFkYgqlph6cYRrcrywMzCy4oRrGTxEmJRksgeJqpRZsAUsEwQydcR//
QQei79dCSctexAi7EQ+Fql18CxzCEei+KApeTyq0oRTncDoGzBw0QQ9LZRQGABi4YRPEI45AyBMi
QRP5kR/XgAfuja+2sFR0ASkGwARgYxFcJCG5wRkI8TloBAA+gdn0IRwkknasARhMD7iwQRP+KOC5
oOECNWEcvCajCiYSbrAkpfIfniAa5Ye3BFKXhsbHBkAmcYlrymIatuEmm2HKtIEns4wFS0XmjCAA
dKEXTIAMVnEUdokORkALuMEaJAFKRBIOpvIvHwIGQlEI0DGCuCH0TEIREJILf/Esga4PyCYFjEpq
3iEZqgEYQkELNMEcOgwaYkBrgOEEYgACimZE8uAoM+sSRJIkAbM114AFAiF3pENFuE8xvxIsh2PZ
bAn9AKCWeJIeggEYFGERTqCKUiQWTCAFn8EENMEIJqUaFIEMFOEZvsEVGEESWjM7JSIYrGEaSKUa
6CAGKEARmAzawAEbYBEqmqHHAAAE/9D+ELVSAESkETThNIEBsESTCKAhwzosGVxBOwF0IlwhGZ7B
lL4BG5LhEDGrVCylXh5hNTxgMmHHEJ9BEYxgAOjyOH3KHDINGKQKGqAhFgJ0RCliFYLBMktF9sDS
R3ZJ9eqBN1PgGsghR3LED42Dai4TGkYANBVhF6HhR77BGvyTRIlUMlyBw7hhD3+kycBBdTplHWbx
95RjM1ZDBgiRasYBG2JhBEqpAkPFGqDBGP6zSMnUP4YhGbBBoLbGHFxhn1IgBmTAA2QgBWQgCmRA
BhKBEMMhGY5MEXSBG4IUGoJhTMu0UNHkFc7UGtLUGjjwlQ5uHhqIgSC1geolHTgMG7A5QRdcgRQM
tVO5RxT+QBboQR3ooVTzgYH0gdK0goFK9R3eIR3EARmi4BQ8tVZHLhsaIhtw1Vb3JiAAADs="""

class Wheel_of_Fortune_Gui(tk.Canvas):
WIDTH = 640
HEIGHT = 480
UPDATE_INTERVAL = 50

def __init__(self, root):
tk.Canvas.__init__(self, root, width=self.WIDTH, height=self.HEIGHT,
bg="lightgreen")
self.degrees = 15
self.width = self.WIDTH
self.height = self.HEIGHT
self.update_interval = self.UPDATE_INTERVAL
self.wheel = self.load_img(WHEEL)
self.tk_image = ImageTk.PhotoImage(self.wheel)

self.create_image(self.WIDTH/2, self.HEIGHT/2, image=self.tk_image,
tag="wheel")
self.after_id = None

def start(self):
if self.after_id is None:
self.run()

def run(self):
self.delete("wheel")
self.tk_image = ImageTk.PhotoImage(self.wheel.rotate(self.degrees))
self.create_image(self.width/2, self.height/2, image=self.tk_image,
tag="wheel")
self.degrees += 15
if self.update_interval < 520:
self.after_id = self.after(self.update_interval, self.run)
self.update_interval += 10
else:
self.after_cancel(self.after_id)
self.after_id = None
self.update_interval = self.UPDATE_INTERVAL


def load_img(self, img):
img = Image.open(StringIO.StringIO(base64.decodestring(img))
).convert("RGBA")
img.load()
return img

def main():
root = tk.Tk()
root.title('WHEEL OF FORTUNE')
wheel_of_fortune_gui = Wheel_of_Fortune_Gui(root)
wheel_of_fortune_gui.pack()
tk.Button(text='Start', command=wheel_of_fortune_gui.start).pack()
root.mainloop()

if __name__ == '__main__':
main()[/code]

Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo ganja !
Da mein Sohn mich die Nächte wach hält, habe ich noch weiter gebastelt. Da das Script mit Bild sehr lang ist, muss alles ab dem Bild aus dem alten Script hinzugefügt werden.
[codebox=pycon file=Unbenannt.txt]WHEEL_TEXT = {15 : "400", 30 : "200", 45 : "900", 60 : "500", 75 : "200",
90 : "BANKRUPT", 105 : "700", 120 : "450", 135 : "200",
150 : "400", 165 : "FREE SPIN", 180 : "750", 195 : "400",
210 : "200", 225 : "600", 240 : "400", 255 : "150",
270 : "1000", 285 : "800", 300 : "250", 315 : "500 GAMBLES",
330 : "300", 345 : "200", 360 : "MISS A TURN"}

class Wheel_of_Fortune_Gui(tk.Canvas):
START_INTERVAL = 50
FULL_ROTATION = 360

def __init__(self, root):
tk.Canvas.__init__(self, root, bg="lightgreen")
self.degrees = 0
self.full_rotation = 360
self.random_degrees = random.choice(WHEEL_TEXT.keys())
self.interval_counter = self.START_INTERVAL
self.wheel = Image.open(StringIO.StringIO(base64.decodestring(
WHEEL))).convert("RGBA")
self.width, self.height = self.wheel.size
self.config(width=self.width, height=self.height)
self.tk_image = ImageTk.PhotoImage(self.wheel)
self.create_image(self.width/2, self.height/2, image=self.tk_image,
tag="wheel")
self.after_id = None

def start(self):
if self.after_id is None:
self.run()

def run(self, update_interval=START_INTERVAL):
self.delete("wheel", "text")
self.tk_image = ImageTk.PhotoImage(self.wheel.rotate(self.degrees))
self.create_image(self.width/2, self.height/2, image=self.tk_image,
tag="wheel")

if self.degrees != self.random_degrees + self.FULL_ROTATION:
if self.interval_counter > 500:
update_interval += 10
self.interval_counter += 10
self.degrees += 7.5
self.after_id = self.after(update_interval, self.run, update_interval)
else:
self.after_cancel(self.after_id)
self.after_id = None
self.degrees = 0
self.create_text((self.width/2, self.height/2),
text = WHEEL_TEXT[self.random_degrees], tag="text")
self.random_degrees = random.choice(WHEEL_TEXT.keys())
self.interval_counter = self.START_INTERVAL

def main():
root = tk.Tk()
root.title('WHEEL OF FORTUNE')
wheel_of_fortune_gui = Wheel_of_Fortune_Gui(root)
wheel_of_fortune_gui.pack()
tk.Button(text='Start', command=wheel_of_fortune_gui.start).pack()
root.mainloop()

if __name__ == '__main__':
main()
[/code]
Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo ganja,

Text drehen über ein Bild geht eigentlich auch.
[codebox=pycon file=Unbenannt.txt]#!/usr/bin/env python
# coding: utf-8

import Tkinter as tk
from PIL import Image, ImageTk, ImageDraw, ImageFont

class Rotate_Text_Gui(tk.Canvas):

def __init__(self, root, text):
tk.Canvas.__init__(self, root, bg = "lightgreen")
self.degrees = 0
font = ImageFont.truetype(
"/usr/share/fonts/truetype/freefont/FreeSans.ttf", 20)
self.img = Image.new("RGBA", (font.getsize(text)[0],
font.getsize(text)[0]))
draw = ImageDraw.Draw(self.img)
draw.text((0, font.getsize(text)[0] / 2 - font.getsize(text)[1] / 2),
text, (0, 0, 0), font = font)
self.tk_image = ImageTk.PhotoImage(self.img)
self.create_image(self.winfo_reqwidth() / 2,
self.winfo_reqheight() / 2, image=self.tk_image, tag="text")
self.after_id = None

def start_stop(self):
if self.after_id is None:
self.run()
else:
self.after_cancel(self.after_id)
self.after_id = None

def run(self):
self.delete("text")
self.degrees += 10
self.tk_image = ImageTk.PhotoImage(self.img.rotate(self.degrees))
self.create_image(self.winfo_reqwidth() / 2,
self.winfo_reqheight() / 2, image=self.tk_image, tag="text")
self.after_id = self.after(50, self.run)

def main():
TEXT = "ROTATE TEXT"
root = tk.Tk()
root.title('ROTATE TEXT')
rotate_text_gui = Rotate_Text_Gui(root, TEXT)
rotate_text_gui.pack()
tk.Button(root, text='Start/Stop', command=rotate_text_gui.start_stop).pack()
root.mainloop()

if __name__ == '__main__':
main()[/code]
Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo,

habe mal versucht Gui und Logik zu trennen. Die Gui bekommt alle Daten über in dict und wird auch über diese gesteuert. Ob jetzt alles so pythonisch ist oder es den Profis weh tut, werde ich in nächster Zeit wissen. Hat aber Spass gemacht und das langt ja auch schon.

Code: Alles auswählen

class Wheel_of_Fortune(object):
    START_INTERVAL = 50
    FULL_ROTATION = 360
    SLOW_DOWN_STEP = 5
    FONT_SIZE = 25
    ROTATE_STEP_DEGREES = 7.5
    
    WHEEL_TEXT = {15 : "400", 30 : "200", 45 : "900", 60 : "500", 75 : "200",
                  90 : "BANKRUPT", 105 : "700", 120 : "450", 135 : "200", 
                  150 : "400", 165 : "FREE SPIN", 180 : "750", 195 : "400", 
                  210 : "200", 225 : "600", 240 : "400", 255 : "150", 
                  270 : "1000", 285 : "800", 300 : "250", 315 : "500 GAMBLES", 
                  330 : "300", 345 : "200", 360 : "MISS A TURN"}
    
    def __init__(self):
        self.wheel =  Image.open(StringIO.StringIO(base64.decodestring(
            WHEEL))).convert("RGBA")
        self.font = ImageFont.truetype(
            "/usr/share/fonts/truetype/freefont/FreeSans.ttf", self.FONT_SIZE)
        self.width, self.height = self.wheel.size
        self.properities = {"images" : list(), "speed" : self.START_INTERVAL,
            "delete_tags" : list()}
        self.properities["images"].append([(self.width / 2, self.height / 2),  
            ImageTk.PhotoImage(self.wheel), "wheel"])
        self.properities["delete_tags"].append("wheel")
        self.random_degrees = random.choice(self.WHEEL_TEXT.keys())
        self.properities["run"] = False
        self.degrees = 0
        
    def set_positions(self):
        self.properities["run"] = True
        self.properities["images"] = list()
        self.properities["images"].append([(self.width / 2, self.height / 2),  
            ImageTk.PhotoImage(self.wheel.rotate(self.degrees)), "wheel"])
        if self.degrees != self.random_degrees + self.FULL_ROTATION:
            if self.degrees > self.FULL_ROTATION:
                self.properities["speed"] += self.SLOW_DOWN_STEP
            self.degrees += self.ROTATE_STEP_DEGREES
        else:
            self.properities["run"] = False
            self.properities["speed"] = self.START_INTERVAL
            self.degrees = 0
            self.properities["images"].append(self.create_text_img(
                self.random_degrees))
            self.random_degrees = random.choice(self.WHEEL_TEXT.keys())
                
    def create_text_img(self, key):
        text = self.WHEEL_TEXT[key]
        text_img = Image.new("RGB", (self.font.getsize(text)[0], 
            self.font.getsize(text)[1]), (235, 0, 219))
        draw = ImageDraw.Draw(text_img)
        draw.text((0, 0), text, (0, 0, 0), font = self.font)
        self.properities["delete_tags"].append("text_img")
        return ((self.width / 2, self.height / 2), 
            ImageTk.PhotoImage(text_img), "text_img")

class Wheel_of_Fortune_Gui(tk.Canvas):
    
    def __init__(self, root):
        tk.Canvas.__init__(self, root, bg="lightgreen")
        self.wheel_of_fortune = Wheel_of_Fortune()
        self.width, self.height = self.wheel_of_fortune.width,\
            self.wheel_of_fortune.height
        self.config(width=self.width, height=self.height)
        for properities in self.wheel_of_fortune.properities["images"]:
            pos, img, tag = properities
            x, y = pos
            self.create_image(x, y, image=img, tag=tag)
        self.after_id = None

    def start(self):
        if self.after_id is None:
            self.run()
    
    def run(self):
        self.wheel_of_fortune.set_positions()
        self.delete(self.wheel_of_fortune.properities["delete_tags"])
        for properities in self.wheel_of_fortune.properities["images"]:
            pos, img, tag = properities
            x, y = pos
            self.create_image(x, y, image=img, tag=tag)
        if self.wheel_of_fortune.properities["run"]:
            self.after_id = self.after(self.wheel_of_fortune.properities[
                "speed"], self.run)
        else:
            self.after_cancel(self.after_id)
            self.after_id = None
            
            
def main():
    root = tk.Tk()
    root.title('WHEEL OF FORTUNE')
    wheel_of_fortune_gui = Wheel_of_Fortune_Gui(root)
    wheel_of_fortune_gui.pack()
    tk.Button(text='Start', command=wheel_of_fortune_gui.start).pack()
    root.mainloop()
if __name__ == '__main__':
    main()
Gruß Frank
Zuletzt geändert von Anonymous am Dienstag 12. Juli 2016, 13:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo,
noch weiter gebastelt - mit eigenem Bild und mit rotierendem Text am Ende.
[codebox=python file=Unbenannt.txt]#!/usr/bin/env python
# coding: utf-8
import random
import Tkinter as tk
from PIL import Image, ImageTk, ImageDraw, ImageFont
import StringIO
import base64

WHEEL = """R0lGODlh+gD6AOfzAAABAAACAAEEAAIFAQQHAgUIBAcJBQgLBwoMCAsNCgwPCw4Q
DA8RDRASDxET
EBIUERMUEhQVExUWFBYYFRcYFhgZFxkbGBocGRscGhwdGx0fHB4fHR8gHiAhHyEjICIkISMkIiQl
IyUnJCYoJScoJigpJykrKCosKSstKiwtKy0uLC4vLS8xLjAyLzEzMDIzMTM0MjQ2MzU3NDY4NTc5
Njg5Nzk6ODo7OTs9Ojw+Oz0/PD5APT9APkBBP0FCQEFDQUNFQkRGQ0VHREZIRUdJRkhJR0lKSEpL
SUpMSkxOS01PTE5QTU9RTlBST1FTUFJUUVNUUlRVU1VWVFZXVVZYVVdZVllbWFpcWVtdWlxeW11f
XF5gXV9hXmBiX2FjYGJkYWNlYmRlY2VmZGZnZWdoZmhpZ2hqZ2lraGpsaWttamxua21vbG5wbW9x
bnFzcHJ0cXN1cnR2c3V3dHZ4dXd5dnh6d3l7eHp8eXt9enx+e31/fH6AfX+BfoCCf4GDgIKEgYOF
goSGg4WHhIaIhYeJhoiKh4mLiIqMiYuNioyOi42PjI6QjY+RjpCSj5GTkJKUkZOVkpSWk5WXlJaY
lZeZlpial5qbmJudmZyem52fnJ6gnZ+hnqCin6GjoKKkoaOloqSmo6WnpKaopaeppqiqp6mrqKqs
qautqqyuq62vrK6wrbCyrrGzr7K0sbO1srS2s7W3tLa4tbe5tri6t7m7uLq8ubu9ury+u72/vL7B
vcDCvsHDv8LEwcPFwsTGw8XHxMbIxcfJxsjKx8nLyMrMycvOys3Py87QzM/RztDSz9HT0NLU0dPV
0tTW09XX1NbY1dja1tnb19rc2dvd2tze293f3N7g3d/h3uDi3+Hk4OPl4eTm4+Xn5Obo5efp5ujq
5+nr6Ors6evu6u3v6+7w7e/x7vDy7/Hz8PL08fP18vT38/b49Pf59vj69/n7+Pr8+fv9+vz/+/7/
/P///////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
SU1QACH5BAEKAP8ALAAAAAD6APoAAAj+AP8JHEiwoMGDCBMqXMiwocOB1P5FmBGAgIGKATJq3MgR
48Y2D0OKHEmypMmTKFOOdGEiwIJlZDrKnEkzUrkJG1Xq3Mmzp8+fBpUEuMjx2BmaSJOucsagowER
Z3oBnUq1qtWTCzzOPOQqqVeZy2QRRWrgqtmzaH+KqPA145RzbeMGUAdJLoEAafPq3XvwiAi5GqFo
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"""


class Wheel_of_Fortune(object):
START_INTERVAL = 20
FULL_ROTATION = 360
SLOW_DOWN_STEP = 5
FONT_SIZE = 50
ROTATE_STEP_DEGREES = 7.5

WHEEL_TEXT = {15 : "400", 30 : "200", 45 : "900", 60 : "500", 75 : "200",
90 : "BANKRUPT", 105 : "700", 120 : "450", 135 : "200",
150 : "400", 165 : "FREE SPIN", 180 : "750", 195 : "400",
210 : "200", 225 : "600", 240 : "400", 255 : "150",
270 : "1000", 285 : "800", 300 : "250", 315 : "500 GAMBLES",
330 : "300", 345 : "200", 360 : "MISS A TURN"}

def __init__(self):
self.wheel = Image.open(StringIO.StringIO(base64.decodestring(
WHEEL))).convert("RGBA")
self.font = ImageFont.truetype(
"/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf",
self.FONT_SIZE)
self.width, self.height = self.wheel.size
self.properities = {"images" : list(), "speed" : self.START_INTERVAL,
"delete_tags" : list()}
self.properities["images"].append([(self.width / 2, self.height / 2),
ImageTk.PhotoImage(self.wheel), "wheel"])
self.properities["delete_tags"].append("wheel")
self.random_degrees = random.choice(self.WHEEL_TEXT.keys())
self.text_img, self.tag, self.text_img_wide = self.create_text_img(
self.random_degrees)
self.text_rotate_degrees = 0
self.properities["run"] = False
self.degrees = 0

def set_positions(self):
self.properities["run"] = True
self.properities["images"] = list()
self.properities["images"].append([(self.width / 2, self.height / 2),
ImageTk.PhotoImage(self.wheel.rotate(self.degrees)), "wheel"])
if self.degrees != self.random_degrees + self.FULL_ROTATION:
if self.degrees > self.FULL_ROTATION:
self.properities["speed"] += self.SLOW_DOWN_STEP
self.degrees += self.ROTATE_STEP_DEGREES
else:
if self.text_rotate_degrees < self.ROTATE_STEP_DEGREES \
* self.text_img_wide * 2:
self.properities["speed"] = self.START_INTERVAL
self.properities["images"].append([(self.width / 2,
self.height / 2), ImageTk.PhotoImage(
self.text_img.rotate(self.text_rotate_degrees).resize((
self.text_img_wide, self.text_img_wide))), self.tag])
self.text_rotate_degrees += self.ROTATE_STEP_DEGREES
self.text_img_wide -= 1
else:
self.properities["run"] = False
self.degrees = 0
self.random_degrees = random.choice(self.WHEEL_TEXT.keys())
self.text_img, self.tag, self.text_img_wide = \
self.create_text_img(self.random_degrees)
self.text_rotate_degrees = 0

def create_text_img(self, key):
text = self.WHEEL_TEXT[key]
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)
self.properities["delete_tags"].append("text_img")
return text_img, "text_img", self.font.getsize(text)[0]


class Wheel_of_Fortune_Gui(tk.Canvas):

def __init__(self, root):
tk.Canvas.__init__(self, root, bg="lightblue")
self.wheel_of_fortune = Wheel_of_Fortune()
self.width, self.height = self.wheel_of_fortune.width,\
self.wheel_of_fortune.height
self.config(width=self.width, height=self.height)
for properities in self.wheel_of_fortune.properities["images"]:
pos, img, tag = properities
x, y = pos
self.create_image(x, y, image=img, tag=tag)
self.after_id = None

def start(self):
if self.after_id is None:
self.run()

def run(self):
self.wheel_of_fortune.set_positions()
self.delete(self.wheel_of_fortune.properities["delete_tags"])
for properities in self.wheel_of_fortune.properities["images"]:
pos, img, tag = properities
x, y = pos
self.create_image(x, y, image=img, tag=tag)
if self.wheel_of_fortune.properities["run"]:
self.after_id = self.after(self.wheel_of_fortune.properities[
"speed"], self.run)
else:
self.after_cancel(self.after_id)
self.after_id = None

def main():
root = tk.Tk()
root.title('WHEEL OF FORTUNE')
wheel_of_fortune_gui = Wheel_of_Fortune_Gui(root)
wheel_of_fortune_gui.pack()
tk.Button(root, text='Start', command=wheel_of_fortune_gui.start
).pack()
root.mainloop()
if __name__ == '__main__':
main()[/code]

Gruß Frank
BlackJack

`properities` klingt ein bisschen nach einer schlimmen Krankheit. ;-)

Was ich nicht verstehe warum diese Werte in einem Wörterbuch stehen?

Bei `WHEEL_TEXT` werden die Schlüssel als Werte nicht verwendet. Die Zahlen sind völlig egal, da könnte man auch andere verwenden, oder auch irgendwelche anderen Datentypen, solange die Werte alle unterschiedlich sind. Also ist das eigentlich ein umständlich geschriebene Liste mit den Werten des Wörterbuchs.

Selbst wenn die Werte wichtig wären, könnte man sie auch einfach berechnen und bräuchte immer noch kein Wörterbuch dafür.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack,

Mein "Hauptschulenglisch" ist so 30 Jahre alt und ich als überzeugter Atheist konnte es immer mit Religion ausgleichen. Ich versuchte ein englisches Wort für Eigenschaften zu finden und landete bei properities. Diese Dict mit Listen fand ich als "Zustandsspeicher" des Rades irgendwie gut. Du bestimmt nicht :-).Die Keys verwende ich als die "Zufallsgradzahl" und natürlich könnte man es auch aus der Listenposition berechnen (pos mal 15 Grad - glaub ich mal so irgendwie). Danke für deine Hinweise und bei der nächsten Version werde ich bestimmt einiges ändern,

Gruß Frank
BlackJack

@kaytec: Okay, falls das nicht rübergekommen ist: `properities` ist falsch geschrieben. Wenn dann `properties`. Ich verstehe halt nicht warum das nicht ganz normal Attribute auf einem Objekt sind, statt die in ein Wörterbuch zu stecken. Und `properties` ist auch ein ziemlich generischer Name. Warum steckt einiges in dem Wörterbuch, anderes aber als Attribute auf dem Objekt?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack,

da bestätigen sich meine Englischkenntnisse - dafür kann ich andere Sachen auch nicht. Nicht das passende Wort für die Eigenschaften eines Rades und immer schön falsch geschrieben. Das Attribut an die Klasse gebunden habe ich nur einmal, bei der Grösse des Rades, gemacht und alle Attribute, die sich ändern in die dict() gesteckt.

Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo,
Es gibt eine Fehler beim Löschen der Bilder auf dem canvas. Die Zeile 77 löscht die Bilder nicht da eine Liste übergeben wird.
[codebox=python file=Unbenannt.txt]self.delete(self.wheel_of_fortune.properities["delete_tags"])[/code]
Doch auch
[codebox=python file=Unbenannt.txt]for tag in self.wheel_of_fortune.properities["delete_tags"]:
self.delete(tag)[/code]
löscht sie nicht. Es bleibt immer der tag "wheel" bestehen und so ganz klar ist es mir nicht ? Es könnten an der Drehung der Bilder liegen ?
Ersatz für die Teile:
[codebox=python file=Unbenannt.txt]for tag in self.find_all():
self.delete(tag)[/code]

Gruß Frank
BlackJack

@kaytec: Das geht auch ohne Schleife: ``self.delete(tk.ALL)``. Als ich mir das angeschaut habe, war ich von Deiner Datenhaltung wieder total verwirrt. Das Tag für rotierten Text wird als `tag` an das Objekt gebunden und in *zwei* Listen gespeichert. Aus der 'delete_tags'-Liste wird nie etwas gelöscht, das heisst die wird bei jedem drehen des Rades um ein 'text_img'-Element länger.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack,

ist mir auch aufgefallen und habe es geändert - das mit tk.ALL kannte ich nicht. Habe noch einiges geändert und werde es auch noch posten. Viele schöne "bastelprogrammier" Lösungen :-). Immer alles vom Canvas löschen finde ich nicht immer die beste Lösung, denn statische Objekte müssen ja nicht immer gelöscht werden. Ob es wirklich der Performance schadet - keine Ahnung ? Wenn das Fenster lange geöffnet ist (Ich vorm Rechner eingeschlafen bin), dann hängt es sich nicht auf wird aber auch langsamer. Hatte zuerst gedacht, dass nicht alles vom Canvas gelöscht wurde - ist aber nicht so ?

Gruß und Dank für die Hilfe
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,
super gemacht, ein Jahr nicht rein geschaut und siehe da, ist das jetzt die endgültige Version, @kaytec in deinem letzten Post hast du geschrieben das du noch etwas ändern, willst, ich habe es mal getestet für mich ist es ok läuft auch, muss mal länger probieren, falls es dann noch langsamer wird wie du geschrieben hast, hast du da schon eine Lösung dafür.
@kaytec Vielen Dank für dein Beispiel

kann man das Bild irgend wie anderes laden als mit diesem encoden 64? das ist so lang :(
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst das Bild daneben legen. Und dann als Datei laden. Damit taucht es im Code nicht mehr auf, und ist auch ein bisschen (25% etwa) kleiner. Dafuer musst du dann aber sicher gehen, dass du das Bild auch findest, da kommt's dann auf das Working-Directory an etc... und es postet sich hier natuerlich nicht so dolle.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @__deets__
ja ich habe es gefunden direkt das Bild zu laden, steht oben, wer lesen kann ....
trotzdem danke für den Tipp.



Gruß
ganja
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Guten Morgen,
kann jemand helfen, ich versuche das an meine Bedürfnisse anzupassen, den text habe ich in gewinn und nichts umbenannt, jetzt würde ich gerne etwas ausführen wenn gewinn stopt, im Moment weiss ich nicht wie ich das abfragen soll! Ich habe gedacht ich frage self.WHEL_TEXT.keys() ab aber da komme ich nicht weiter, vielleicht hat einer von euch einen Vorschlag wie ich das lösen kann.

Danke
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@ganja: zeige was Du versucht hast (mit Code), das Ergebnis, das erwartete Verhalten und eventuelle Fehlermeldungen.
Antworten