Button event auslösen solange linke Maustaste gedrückt ist

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 15. November 2008, 00:37

Hallo loggod

Noch eine Frage zum Code-Snippet, welches du in deinem ersten Post vorgestellt hast. Ist dies dein Original Skript? Weil da hat es Einrück-Fehler drin. Ist dies eventuell beim transverieren ins Forum passiert?

Noch ein Tipp:
Bei der Konfiguration der Grid-Layout-Manager Anweisungen würde ich die 'sticky'-Option mit dem Wert 'nesw' belegen damit das betreffende Button-Widget das ganze Grid-Feld ausfüllt.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. November 2008, 06:29

wuf hat geschrieben:Aber GIMP hat noch einige Zusätze (Plugin's) die es einem ermöglichen eigene Kunstwerke zu erstellen und als .gif's zu exportieren.
Das Problem ist auch weniger das Erstellen optisch ansprechender Buttons/Icons, sondern der Export in das GIF-Format mit seiner Beschränkung auf 256 Farben. Ich habe schon manches schöne Icon als png gehabt und nach der Konvertierung nach gif konnte man es wegschmeißen, weil z.B. sanfte Kantenübergänge und Farbverläufe nicht mehr so fein dargestellt werden konnten.
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 15. November 2008, 10:58

Hallo numerix

Hast du schon eimal versucht das PIL-Packet für die Darstellung von Bilder einzusetzen. Zum Beispiel für ein Icon im .png-Format. Das PIL-Packet enthält ein Modul 'ImageTk' die sich hierfür eignet.

Hier ein kleines Testprogramm:

Code: Alles auswählen

import Tkinter as tk
import Image
import ImageTk


test_window = tk.Tk()

pil_icon = Image.open("archive.png")

pil_icon_1 = pil_icon.rotate(45)
pil_icon_2 = pil_icon.resize((70,70))

tk_icon = ImageTk.PhotoImage(pil_icon)
tk_icon_1 = ImageTk.PhotoImage(pil_icon_1)
tk_icon_2 = ImageTk.PhotoImage(pil_icon_2)

button = tk.Button(test_window, image=tk_icon)
button.pack(side='left')

button = tk.Button(test_window, image=tk_icon_1)
button.pack(side='left')

button = tk.Button(test_window, image=tk_icon_2)
button.pack(side='left')

test_window.mainloop()

Der Output für mein Bildchen 'archive.png':

Bild

Gruss wuf :wink:
Take it easy Mates!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. November 2008, 10:58

numerix hat geschrieben:Export in das GIF-Format mit seiner Beschränkung auf 256 Farben.
True-Color GIFs anyone? (Infos dazu)

Aber gut, davon abgesehen ist GIF sowieso am besten durch PNG zu ersetzen und damit hat es sich.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 15. November 2008, 11:10

@Leonidas

Danke für den interessanten Link

In letzter Zeit häufen sich Post's die im gleichen Zeitfenster eintreffen. :lol: Muss etwas mit der momentanen Planeten-Konstellation zu tun haben.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. November 2008, 11:48

Leonidas hat geschrieben:
numerix hat geschrieben:Export in das GIF-Format mit seiner Beschränkung auf 256 Farben.
True-Color GIFs anyone? (Infos dazu)

Aber gut, davon abgesehen ist GIF sowieso am besten durch PNG zu ersetzen und damit hat es sich.
Interessant (und für mich neu). Habe eben ein bisschen damit herumgespielt und es scheint doch eher amüsant als ernsthaft praktikabel. Bei der Umwandlung in eine png-Datei hat mir mein Konverter (kim) 173(!) png-Dateien produziert, jede mit einzelnen Teilen der GIF-Datei ... :lol:
(Mittels gimp habe ich dann konvertieren können)

Man könnte also sagen: Theoretisch gibt es True-Color-GIFs, praktisch kann man sie eigentlich nicht gebrauchen. Und wie du schon selbst gesagt hast: png statt gif sollte die Lösung sein.

@wuf: Ja, ich habe mal mit PIL und Tkinter experimentiert. Was mir daran nicht gefällt ist zum einen, dass ich PIL zusätzlich einsetzen muss und zum anderen, dass es nach meinem Kenntnisstand nicht möglich ist, wie bei gif-Dateien diese über base64-Encoding (oder auch sonstwie) in den Quelltext zu integrieren, was ich immer dann gerne einsetze (in ein extra Modul ausgelagert, weil es eigentlich ja wirklich hässlich ist), wenn ich vorhabe, ein exe-File daraus zu machen, das zur Weitergabe an andere bestimmt ist, weil man dann wirklich alles in einer Datei hat und auch der Dümmste nix mehr falsch machen kann. :wink:

Aber vielleicht gibt es ja doch einen Weg, so etwas auch mit png-Grafiken zu realisieren?
loggod
User
Beiträge: 6
Registriert: Mittwoch 12. November 2008, 23:38

Samstag 15. November 2008, 17:17

Hi Zusammen,

ich wollte mich nur nochmal für das Rege Interesse und die vielen Antworten bedanken.

@wuf: Die Icons im RAW Format direkt einzubinden und nicht auf nen OS Iconset zuzugreifen, finde ich sehr cool :wink: .Bestes Forum ever! .. Hier gefällts mir.

Dank euch. Also dann:...Bis zum nächsten Post! :wink:

Gruß,
loggod
loggod
User
Beiträge: 6
Registriert: Mittwoch 12. November 2008, 23:38

Samstag 15. November 2008, 23:17

Hi,

das hab ich schlußendlich draus gebastelt um nochmal zu zeigen was ich an funktionalität haben wollte :wink:

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8

import Tkinter as tk
import threading
import time

from ScrolledText import *

class navpad(object):
	def __init__(self):
		     
		self.mainForm = tk.Tk()
		self.mainFrame = tk.Frame (self.mainForm)
	        self.mainFrame.grid(row=1,column=0)
		
		self.mainFrame2 = tk.Frame (self.mainForm)
	        self.mainFrame2.grid(row=0,column=0)
		
		self.textfenster=ScrolledText(self.mainFrame2)
		self.textfenster.grid(row=0, column=1)

		
		self.buttonNameHL = tk.Button(self.mainFrame,text='HL',command=None)
		self.buttonNameHL.grid(row=1,column=1,sticky= 'nesw')
		self.buttonNameHL.bind('<Button-1>',lambda event, name='hoch links': self.button1_press(event, name))
		self.buttonNameHL.bind('<ButtonRelease-1>',lambda event, name='hoch links': self.button1_release(event, name))
		
		self.buttonNameHO = tk.Button(self.mainFrame,text='HO',command=None)
	        self.buttonNameHO.grid(row=1,column=2,sticky= 'nesw')
		self.buttonNameHO.bind('<Button-1>',lambda event, name='hoch': self.button1_press(event, name))
		self.buttonNameHO.bind('<ButtonRelease-1>',lambda event, name='hoch': self.button1_release(event, name))
		
		self.buttonNameHR = tk.Button(self.mainFrame,text='HR',command=None)
		self.buttonNameHR.grid(row=1,column=3,sticky= 'nesw')
		self.buttonNameHR.bind('<Button-1>',lambda event, name='hoch rechts': self.button1_press(event, name))
		self.buttonNameHR.bind('<ButtonRelease-1>',lambda event, name='hoch rechts': self.button1_release(event, name))
		
		self.buttonNameLI = tk.Button(self.mainFrame,text='LI',command=None)	
		self.buttonNameLI.grid(row=2,column=1,sticky= 'nesw')
		self.buttonNameLI.bind('<Button-1>',lambda event, name='links': self.button1_press(event, name))
		self.buttonNameLI.bind('<ButtonRelease-1>',lambda event, name='links': self.button1_release(event, name))
	       	
		self.buttonNameRE = tk.Button(self.mainFrame,text='RE',command=None)			
		self.buttonNameRE.grid(row=2,column=3,sticky= 'nesw')
		self.buttonNameRE.bind('<Button-1>',lambda event, name='rechts': self.button1_press(event, name))
		self.buttonNameRE.bind('<ButtonRelease-1>',lambda event, name='rechts': self.button1_release(event, name))
	        
		self.buttonNameRL = tk.Button(self.mainFrame,text='RL',command=None)			
		self.buttonNameRL.grid(row=3,column=1,sticky= 'nesw')
		self.buttonNameRL.bind('<Button-1>',lambda event, name='runter links': self.button1_press(event, name))
		self.buttonNameRL.bind('<ButtonRelease-1>',lambda event, name='runter links': self.button1_release(event, name))
	        
		self.buttonNameRU = tk.Button(self.mainFrame,text='RU',command=None)        		
		self.buttonNameRU.grid(row=3,column=2,sticky= 'nesw')
		self.buttonNameRU.bind('<Button-1>',lambda event, name='runter': self.button1_press(event, name))
		self.buttonNameRU.bind('<ButtonRelease-1>',lambda event, name='runter': self.button1_release(event, name))
		
		self.buttonNameRR = tk.Button(self.mainFrame,text='RR',command=None)			
		self.buttonNameRR.grid(row=3,column=3,sticky= 'nesw')
		self.buttonNameRR.bind('<Button-1>',lambda event, name='runter rechts': self.button1_press(event, name))
		self.buttonNameRR.bind('<ButtonRelease-1>',lambda event, name='runter rechts': self.button1_release(event, name))
		
		self.mainForm.title("navpad_test")
	 	self.mainForm.mainloop()
  	
 
	def button1_press(self, event, name):	
		self.flag = True	
		self.thread = threading.Thread(target=self.workThread, args=(name, ))		
		self.thread.start() 				
		

	def button1_release(self, event, name):
		self.flag = False
	
		
	def workThread(self,name):
		count = 0		
		while self.flag:
			outtxt =  name+ ":(" +str(count) +" X)"+"\n"
			self.textfenster.insert(0.0, outtxt)			
			time.sleep(0.05)
			count +=1
			self.textfenster.delete('1.0',END)
navpad() 
PS (@wuf): ich benutze ubuntu + gedit als editor. Irgendwas scheint mit den Einrückungen nicht zu stimmen, wenn ich den code hier in einfüge:(

Gruß,
loggod
BlackJack

Samstag 15. November 2008, 23:32

@loggod: Der Python Style Guide empfiehlt vier Leerzeichen pro Ebene und keine Tabs zu verwenden.
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Sonntag 16. November 2008, 10:15

Hallo loggod

Funktioniert ja bestens! Wegen dem Einrücken würde ich einmal die Ratschläge von 'BlackJack' befolgen. Da würde ich noch ein bisschen herumexperimentieren. Du kannst ja in userem Sub-Forum 'Just Testing' ausprobieren ob beim transferieren deines Skripts alles korrekt abläuft. Nicht vergessen von Zeit zu Zeit im Style-Guide PEP-8 reinschauen.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Sonntag 16. November 2008, 12:21

Hallo loggod !

Habe mal die Buttons ueber eine Schleife generiert und das Modul "threading" hreausgenommen.

http://paste.pocoo.org/show/91334/

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Sonntag 16. November 2008, 14:40

Hallo loggod !

Habe es mal mit einem bewegten Punkt auf einem Canvas gemacht.

http://paste.pocoo.org/show/91349/

gruss frank
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Sonntag 16. November 2008, 21:17

Hallo loggod,
Du solltest doch keine Threads verwenden (...grrmbl...).
Wenn man das nicht richtig macht, geht das schief, wie
ich aus eigener (leidvoller) Erfahrung weiss.
Bei meinem Chatprogramm mit Tkinter und Threads
kam es sporadisch zu Segfaults, merkwürdigerweise
nur auf meinem Xubuntu-Rechner, nicht auf den XP-Rechnern
der anderen Teilnehmer.
Nachdem ich das Konzept aus
http://effbot.org/zone/tkinter-threads.htm
übernommen hatte, war das Problem behoben.

Habe kaytec's 1.Demo nochmal um eine
andere Funktionalität erweitert.
Jetzt stoppt der Zähler, wenn der Mauszeiger
den Button verlässt und läuft weiter wenn
der Mauszeiger wieder darüberfährt.
(Kommt natürlich immer drauf an, wie man's haben will)

http://paste.pocoo.org/show/91385/


The ten commandments:
1. Thou shalt not call the gui from another thread.
2. Thou shalt use lists and loops.
3. Thou shalt use lists and loops.
4. Thou shalt...
...

:wink:
yipyip
Antworten