Seite 2 von 4
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 10:37
von ganja
hallo @Sirius3 viel habe ich nicht versucht da ich nicht weiß wo ich abfragen soll,
hier angepasst
WHEEL_TEXT = {45 : "gewinn", 90 : "nichts", 135 : "gewinn", 180 : "nochmal", 225 : "gewinn", 270 : "nichts", 315 : "gewinn", 360 : "gewinn"}
Code: Alles auswählen
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
#print self.WHEEL_TEXT.keys()
#self.stop_text()
####### hier mein versuch ########
print (self.random_degrees)
if self.random_degrees in [45,135,225,315,360]:
self.stop_text()
##### leider bekomme ich da schon im voraus wo es stehen bleibt , ich weiß nicht wo ich ansetzen muss damit ich erst dann etwas zurück bekomme wenn das Rad stehen bleibt, damit ich dann andere Funktion aufrufen kann. z.b ich drehe das Rad und ich bekomme schon etwas zurück 45, wenn das Rad steht bekomme ich dann das nächste 315 wo es beim nächsten mal stehen bleiben wird
######
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:30
von Alfons Mittelmeyer
ganja hat geschrieben:Hallo,
Hat das schon jemand gemacht? Meine Kinder haben Ideen

! 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
Also, es ist kein Problem Kreisausschnitte zu nehmen, die sich drehen. Sorry, dass ich faul war und nur drei erstellt hatte:
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.canvas = Canvas_1(self)
self.canvas.pack()
class Canvas_1(tk.Canvas):
def __init__(self,master,**kwargs):
tk.Canvas.__init__(self,master,**kwargs)
self.config(cursor='crosshair')
# widget definitions ===================================
coords = (81,38,281,238)
item = self.create_arc(*coords)
self.itemconfig(item,fill = '#ffff86',extent = '20.0',tags = 'p1')
coords = (81,38,281,238)
item = self.create_arc(*coords)
self.itemconfig(item,start = '20.0',fill = '#a4ffff',extent = '20.0',tags = 'p2')
coords = (81,38,281,238)
item = self.create_arc(*coords)
self.itemconfig(item,start = '40.0',fill = '#aeeb94',extent = '20.0',tags = 'p3')
self.angle = 0
self.slices = ('p1','p2','p3')
self.turn_wheel()
def turn_wheel(self):
self.angle += 1
angle = self.angle
for item in self.slices:
self.itemconfig(item,start = angle)
angle += 20
self.after(5,self.turn_wheel)
if __name__ == '__main__':
Application().mainloop()
Dann ist auch falsch, was hier bisher behauptet wurde, nämlich dass sich Text nicht drehen läßt. Text läßt sich genauso drehen.
Sorry, dass ich auf Drehen verzichtet habe, sondern nur die Benuzung des Winkels darstelle:
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.canvas = Canvas_1(self)
self.canvas.pack()
class Canvas_1(tk.Canvas):
def __init__(self,master,**kwargs):
tk.Canvas.__init__(self,master,**kwargs)
self.config(cursor='crosshair')
# widget definitions ===================================
coords = (200,120)
item = self.create_text(*coords)
self.itemconfig(item,anchor = 'w',text = ' Text 0 Grad')
coords = (200,120)
item = self.create_text(*coords)
self.itemconfig(item,angle = '20.0',anchor = 'w',text = ' Text 20 Grad')
coords = (200,120)
item = self.create_text(*coords)
self.itemconfig(item,angle = '40.0',anchor = 'w',text = ' Text 40 Grad')
if __name__ == '__main__':
Application().mainloop()
Wenn man so etwas bei effbot nachschaut, findet man das nicht:
http://effbot.org/tkinterbook/canvas.ht ... ext-method
Ich schon des öfteren festgestellt, dass da oft das Wichtigste vergessen wird. Aber mein GuiDesigner zeigt es an und man kann mit allen Parametern experimentieren. Da gibt es nämlich auch CanvasPaint.
Und das tcl/tk Manual taugt da leider auch nichts:
https://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M152
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:40
von BlackJack
@Alfons Mittelmeyer: Text kann man nicht drehen. Erst behaupten diese Aussage sei falsch, es dann aber nicht belegen… vielleicht weil es nicht geht‽
Edit: Dein zweites Beispiel:
[codebox=text file=Unbenannt.txt]$ python forum3.py
Traceback (most recent call last):
File "forum3.py", line 35, in <module>
Application().mainloop()
File "forum3.py", line 13, in __init__
self.canvas = Canvas_1(self)
File "forum3.py", line 28, in __init__
self.itemconfig(item,angle = '20.0',anchor = 'w',text = ' Text 20 Grad')
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2290, in itemconfigure
return self._configure(('itemconfigure', tagOrId), cnf, kw)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1196, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: unknown option "-angle"[/code]
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:47
von Alfons Mittelmeyer
BlackJack hat geschrieben:@Alfons Mittelmeyer: Text kann man nicht drehen. Erst behaupten diese Aussage sei falsch, es dann aber nicht belegen… vielleicht weil es nicht geht‽

Sorry, ich habe doch das Beispiel mit dem Winkel gebracht. Natürlich einzelne Buchstaben um 90 Grad drehen, das geht nicht. Geht natürlich auch, wenn man das in Polarkoordinaten für das Rad Drehen umrechnet.
@BlackJack, hast Du übersehen, dass man da 'angle' angeben kann? Hast Du mein Beispiel nicht angesehen?
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:49
von BlackJack
@Alfons Mittelmeyer: Das Beispiel mit dem Winkel führt bei mir zu einer Ausnahme das `angle` nicht bekannt ist.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:53
von Alfons Mittelmeyer
BlackJack hat geschrieben:@Alfons Mittelmeyer: Das Beispiel mit dem Winkel führt bei mir zu einer Ausnahme das `angle` nicht bekannt ist.
Welche tkinter Version benutzt Du? Ich benutze tkinter 8.6
Hab vorher auch falsch gegoogled. Im Manual von tcl/tk 8.6 steht es nämlich drin:
https://www.tcl.tk/man/tcl8.6/TkCmd/canvas.htm#M156
Ist mir nämlich vor Kurzem aufgefallen, als ich mit Text beim Canvas im GuiDesigner angesehen hatte. Da war plötzlich ganz unter unter der Rubrik 'other' angle drin. Hatte schon geglaubt, ich hätte es übersehen, weil ich normalerweise die Reihenfolge geordnet haben sollte. Naja, jetzt ist es klar. Es war eben bei früheren tkinter Versionen nicht da.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 11:56
von BlackJack
@Alfons Mittelmeyer: Du meinst Tk. Und damit wäre dann auch geklärt das Effbot nichts vergessen hat und auch die Aussage das die Tcl/Tk-Dokumentation nichts taugt etwas vorschnell war. Denn Tk 8.6 kennt `-angle` für Texte. Tk 8.5 halt noch nicht.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 12:05
von Alfons Mittelmeyer
BlackJack hat geschrieben:@Alfons Mittelmeyer: Du meinst Tk. Und damit wäre dann auch geklärt das Effbot nichts vergessen hat und auch die Aussage das die Tcl/Tk-Dokumentation nichts taugt etwas vorschnell war. Denn Tk 8.6 kennt `-angle` für Texte. Tk 8.5 halt noch nicht.
Das habe ich in meinem vorigen Post schon berichtigt, dass es nämlich schon im Manual für 8.6 richtig dokumentiert ist. Effbot allerdings gibt nichts an über tkinter Versionen und da steht auch nichts drin. Genausowenig wie beim PanedWindow paneconfig bei effbot etwas über 'stretch' drin steht, was doch auch besonders wichtig ist.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 13:37
von BlackJack
Bezüglich Effbot: „This is the Tkinter introduction, last updated in November 2005.“
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 13:50
von ganja
Toll was alles geht, ich finde das Beispiel von @kaytec gut, für mich ok, wie gesagt möchte ich nur wenn das Rad stoppt wissen was gestoppt wurde gewonnen oder nichts um weitere Funktion aufzurufen, hat jemand eine Idee wo ich da ansetzen muss?
Danke
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 13:56
von Alfons Mittelmeyer
BlackJack hat geschrieben:Bezüglich Effbot: „This is the Tkinter introduction, last updated in November 2005.“
Genau! Effbot ist also zwar schön zu lesen, weil es tkinter behandelt, aber ist veraltet. Die tcl/tk Dokumentation aber ist up to date und sollte daher unbedingt auch gelesen werden. Allerdings, wer schon liest bei jeder neuen tkinter Version die Doku durch und vergleicht, ob etwas hinzugekommen ist?
Mein GuiDesigner liest die config aus und zeigt daher fast alle Parameter. Nicht allle, da sich einige nicht mehr nach Erzeugen des Widgets verändern lassen, wie etwa 'screen' bei tk.Tk oder 'class'. Und einige sind durch etwas anderes ersetzt, wie etwa 'photoimage' mit Angabe des Files statt 'image'.
Und neu hinzugekommene config Parameter finden sich unter der Rubrik 'other'. Sind also gleich zu sehen.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 14:04
von BlackJack
Die Referenzdokumentation von New Mexico Tech ist aktueller, wenn auch noch nicht bei 8.6:
http://infohost.nmt.edu/tcc/help/pubs/t ... index.html
Normalerweise gibt es bei neuen Versionen von Software eine Dokumentation der Änderungen.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 14:24
von ganja
Keiner eine Idee für mein Problem?
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 15:42
von Alfons Mittelmeyer
ganja hat geschrieben:Keiner eine Idee für mein Problem?
Wenn Du eine ganz einfache Lösung haben möchtest und wenn Du Pillow installiert hast, dann gibt es etwas sehr Simples:
Man nehme ein Bildchen. Man nehme einmal das hier:
Man speichere es als fortune.png ab.
Und dann braucht man auch keinen Canvas, sondern ein Label genügt:
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
from PIL import Image,ImageTk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.label_pil_img = Image.open('fortune.png')
self.label = tk.Label(self)
self.label.pack()
self.angle=0
self.img_rotate()
def img_rotate(self):
self.angle += 5
self.img_new = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img_new
self.after(1,self.img_rotate)
if __name__ == '__main__':
Application().mainloop()
Na, was hältst Du davon?
Schöner natürlich wäre dies. Du bastelst mit Deinen Kindern so eine Scheibe, und ihr bemalt sie. Dann fotografierst Du sie ab und läßt sie dann auf dem Computer rotieren.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 15:54
von BlackJack
@Alfons Mittelmeyer: Die Lösung gab's vor einem Jahr bereits auf der ersten Seite dieses Themas, dritte Antwort, von kaytec. Das ist aber auch gar nicht mehr die aktuelle Frage.
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 15:55
von ganja
Hallo @Alfons Mittelmeyer das habe ich schon alles gemacht, ich hab das Bild es läuft auch habe mich an @kayteec seins orientiert, mein Problem ist das ich etwas über die gpio ausführen will wenn das Rad zum stehen kommt und gewonnen, da habe ich mein Problem, ich weiß nicht wo ich abfragen soll wo steht es jetzt,
Gruß ganja
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 16:02
von Alfons Mittelmeyer
ganja hat geschrieben:Hallo @Alfons Mittelmeyer das habe ich schon alles gemacht, ich hab das Bild es läuft auch habe mich an @kayteec seins orientiert, mein Problem ist das ich etwas über die gpio ausführen will wenn das Rad zum stehen kommt und gewonnen, da habe ich mein Problem, ich weiß nicht wo ich abfragen soll wo steht es jetzt,
Gruß ganja
Also da machst Du ein Dictionary und trägst zu den Winkeln den Wert ein. Den Winkel solltest Du doch wissen und über das Dictionary weißt Du dann, was es ist.
Das wäre dann noch ein Beispiel mit Turbo nach erstem Durchlauf:
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
from PIL import Image,ImageTk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.label_pil_img = Image.open('fortune.png')
self.label = tk.Label(self)
self.label.pack()
self.angle=0
self.img_dict = {}
self.img_rotate()
def img_rotate(self):
self.angle += 5
self.angle = self.angle % 360
if self.angle not in self.img_dict:
self.img_dict[self.angle] = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img_dict[self.angle]
self.after(1,self.img_rotate)
else:
self.label['image'] = self.img_dict[self.angle]
self.after(1,self.img_rotate)
if __name__ == '__main__':
Application().mainloop()
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 16:12
von ganja
dein beispiel ist gut @Alfons Mittelmeyer ganz wenig code , wie stoppt man es und wie startet man es, ich versuche jetzt eine Funktion zu schreiben das es dann nach 5 Sekunden stoppt und starten auch, self.img_dict = {} hier kommen dann die winkel z.b. 15,30 ... 360 oder?
Gruß
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 18:06
von Alfons Mittelmeyer
ganja hat geschrieben:dein beispiel ist gut @Alfons Mittelmeyer ganz wenig code , wie stoppt man es und wie startet man es, ich versuche jetzt eine Funktion zu schreiben das es dann nach 5 Sekunden stoppt und starten auch, self.img_dict = {} hier kommen dann die winkel z.b. 15,30 ... 360 oder?
Gruß
Wie findest Du diese Stopp Idee?
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
from PIL import Image,ImageTk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.label_pil_img = Image.open('fortune.png')
self.label = tk.Label(self)
self.bind('<Button 1>',self.wheel_stop)
self.label.pack()
self.angle=0
self.img_dict = {}
self.angle_step = 10
self.img_rotate()
def img_rotate(self):
self.angle += self.angle_step
self.angle = self.angle % 360
if self.angle_step != 10:
self.img = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img
if not (self.angle % 15):
self.angle_step -= 1
if self.angle_step:
self.after(1,self.img_rotate)
else:
print(self.angle)
else:
if self.angle not in self.img_dict:
self.img_dict[self.angle] = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img_dict[self.angle]
self.after(1,self.img_rotate)
def wheel_stop(self,event):
self.angle_step = 5
if __name__ == '__main__':
Application().mainloop()
Re: Anfänger frage wheel of fortune
Verfasst: Mittwoch 9. August 2017, 18:29
von ganja
hi @Alfons Mittelmeyer, nicht schlecht aber nicht das was ich brauche möchte, du hast gerade ein lauf hier dein code mit meinen wünschen

, vielleicht hast es auch schon so weit.
Danke für die bespiele
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
from PIL import Image,ImageTk
class Application(tk.Tk):
### so ist mein Bild aufgebaut wo packe ich das hin, um nachher irgend etwas auszuführen wenn Gewinn
#WHEEL_TEXT = {45 : "GEWINN", 90 : "NICHTS", 135 : "GEWINN", 180 : "NICHTS", 225 : "GEWINN", 270 : "NICHTS", 315 : "GEWINN", 360 : "GEWINN"}
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.label_pil_img = Image.open('Gluecksrad_750.png')
self.label = tk.Label(self)
self.bind('<Button 1>',self.wheel_stop)
#self.bind.after(5,self.wheel_stop)
self.label.pack()
self.angle=0
self.img_dict = {}
self.angle_step = 10
self.img_rotate()
self.stop = False
### hier mit starten mit space taste
self.Button = tk.Button(self, text='START', font=("Helvetica bold", 80), command=self.img_rotate
).pack()
### nach 5 secunden stoppen von alleine oder eine andere zeit muss ich erst sehen ob 5 zu kurz oder zu lang
def img_rotate(self):
self.angle += self.angle_step
self.angle = self.angle % 360
if self.angle_step != 10:
self.img = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img
if not (self.angle % 15):
self.angle_step = max(0,self.angle_step-1)
if self.angle_step:
self.after(1,self.img_rotate)
else:
print(self.angle)
else:
if self.angle not in self.img_dict:
self.img_dict[self.angle] = ImageTk.PhotoImage(self.label_pil_img.rotate(self.angle))
self.label['image'] = self.img_dict[self.angle]
self.after(1,self.img_rotate)
def wheel_stop(self,event):
self.angle_step = 5
## die grösse möchte ich vom Fenster definieren so wie farbe etc
if __name__ == '__main__':
Application().mainloop()