Anfänger frage wheel of fortune

Fragen zu Tkinter.
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.
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.
Antworten