PhotoImage Bildpunkte sollen nacheinander erscheinen

Fragen zu Tkinter.
Antworten
uwi2k2
User
Beiträge: 3
Registriert: Dienstag 10. April 2007, 19:33

hallo zusammen,

vorweg muss ich gestehen das ich python neuling bin.
aber ich hab schon in so ziehmlich allen anderen sprachen gearbeitet.

nun zum thema:
ich habe mit Tkinter ein kleines ( noch sehr sinnloses ) prog gebaut.
dieses soll später ein pathfinder nach dem A*-Algorithmus werden.
es soll dann durch eine landschaft aus wald und wasser den richtigen
weg finden. um zu überprüfen ob mein script effizient arbeitet möchte ich,
wären der pfad feld für feld ( oder pixel für pixel ) gesucht wird , die
entwicklung verfolgen können...
nun hab ich einfach mal um das zu testen einen button gebaut der eine
funktion aufruft in der zwei for anweisungen verschachtelt sind.
( die printanweisung ist nur ne spielerei für die sprachausgabe )

Code: Alles auswählen

def set_point( x , y ):
    bild.put('#0000ff', (x, y) )
    return TRUE

def karte():
    print "Map created!"
    for i in range(500) :
        for j in range(500) :
            set_point( i , j)
was nun aber passiert ist, das das programm erst alle felder ermittelt und
mit der farbe füllt und dann auf einen schlag auf dem bildschirm
ausgiebt... ich bräuchte aber soetwas wie einen 'zeilenweise' aufbauen
der felder ( pixel nach pixel ) ....

geht so etwas ?
muss ich dafür ein anderes modul verwenden ?

ich hänge nochmal den gesamten code an.

vielen dank schonmal
kai

Code: Alles auswählen

#python
import sys

class Sprachausgabe (object):
	def __init__(self):
		from win32com.client import constants
		import win32com.client
		self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
		self.stdout = sys.stdout

	def write(self, text):
		self.stdout.write(text)
		self.speaker.Speak(text)

sprachausgabe=Sprachausgabe()
sys.stdout=sprachausgabe

def set_point( xi , yi ):
    bild.put('#0754EC', (xi , yi) )
    return TRUE

def karte():
    print "Map created!"
    for i in range(500) :
        for j in range(500) :
            set_point( i , j)

def path():
    print "Path found!"
    
from Tkinter import *
fenster = Tk()
fenster.title('Pathfinder')
fenster.minsize( width='850' , height='650')

bild = PhotoImage(width=500 , height=500)
bildflaeche = Label( master=fenster , image=bild )
bildflaeche.pack()

fenster.von = Entry(master=fenster , width=10 )
fenster.von.pack(padx=1, pady=1, anchor=N,side=LEFT)

fenster.nach = Entry(master=fenster , width=10)
fenster.nach.pack(padx=1, pady=1, anchor=N,side=LEFT)

fenster.button = Button(master=fenster , text='Karte' , command=karte , width=10)
fenster.button.pack( anchor=N,side=LEFT )

fenster.button2 = Button(master=fenster , text='Path' , command=path , width=10)
fenster.button2.pack( anchor=NW,side=LEFT )

fenster.mainloop()
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hi,

dir fehlt noch ein fenster.update()
Das update zeichnet so weit ich noch weiss, 100 pixel auf einmal.
Insgesamt würde ich im Moment es so schreiben.

Code: Alles auswählen

def set_point( xi , yi ):
    bild.put('#0754EC', (xi , yi) )
    #return TRUE

def karte():
    print "Map created!"
    for i in xrange(500) :
        for j in range(500) :
            set_point( i , j)
        fenster.update()
   
uwi2k2
User
Beiträge: 3
Registriert: Dienstag 10. April 2007, 19:33

hallo und danke für die antwort,

ich hab das ganze über "thread.start_new_thread()" gelöst.
aber deine methode werd ich auch nochmal probieren ...

cu
kai
BlackJack

Tkinter ist wie die meisten GUIs nicht thread-safe, man sollte also nicht aus einem anderen Thread in dem die `mainloop()` läuft auf die GUI zugreifen. Das kann komische Effekte bis hin zu Programmabstürzen zur Folge haben.
Antworten