Anfänger frage wheel of fortune

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

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
		######
Zuletzt geändert von Anonymous am Mittwoch 9. August 2017, 10:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

ganja hat geschrieben: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
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
Zuletzt geändert von Alfons Mittelmeyer am Mittwoch 9. August 2017, 11:45, insgesamt 1-mal geändert.
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]
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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?
Zuletzt geändert von Alfons Mittelmeyer am Mittwoch 9. August 2017, 11:50, insgesamt 1-mal geändert.
BlackJack

@Alfons Mittelmeyer: Das Beispiel mit dem Winkel führt bei mir zu einer Ausnahme das `angle` nicht bekannt ist.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
Zuletzt geändert von Alfons Mittelmeyer am Mittwoch 9. August 2017, 12:01, insgesamt 1-mal geändert.
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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
BlackJack

Bezüglich Effbot: „This is the Tkinter introduction, last updated in November 2005.“
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Keiner eine Idee für mein Problem?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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:

Bild

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.
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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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()
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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ß
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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()
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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 :D, 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()
Antworten