Seite 2 von 3

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 09:02
von questlove
ja das weis ich mittlerweile..danke
Auf das wollte ich aber nicht hinaus. Ich hab mich auch selber verwirrt ein bisschen. es hat garnichts mit dem pack() zu tun wie du schon sagst. Das problem ist das eingefügte Bild wird nur sichtbar wenn der code nach dem Einfügen durch einen Fehler abbricht und einen Fehler anzeigt. Wieso ist da so? W liegt da der Fehler?

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 09:59
von BlackJack
@questlove: Das lässt sich ohne Quelltext schlecht sagen. Oder beziehst Du Dich auf den in dem Beitrag weiter oben? Da fehlt auf jeden Fall der Aufruf der Hauptschleife (`wurzel.mainloop()`).

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:04
von questlove
ja mein post von davor.. da steht doch ganz unten dass sich mein programm aus 2 modulen aufbaut.
1. logik
2. GUI

da steht mein ganzer Quelltext..

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:05
von questlove
und die hauptschleife ist in Logik

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:20
von Xynon1
@questlove
Ist jetzt aber nicht logisch, das sich die Hauptschleife der GUI in der Logik versteckt. :)

Was für eine Fehlermeldung kommt denn?

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:28
von BlackJack
@questlove: Die GUI-Hauptschleife ist in Logik? Klingt unlogisch. ;-)

Du hast da zwei Module die sich gegenseitig importieren. Das ist im Grunde niemals eine gute Idee. Das solltest Du erst einmal ändern. Wenn sich zwei Module gegenseitig brauchen, dann sind sie so eng verbunden, dass sie im Grunde in ein einziges gehören, oder die Trennung nicht sauber gemacht ist. Zumal das oft auch gar nicht so funktioniert wie man sich das vielleicht wünscht. Man muss da nämlich sehr genau darauf achten welcher Code zu welchem Zeitpunkt ausgeführt wird, beim Importieren der Module.

Bei GUI und Logik ist es üblicherweise so, dass das GUI-Modul das Logik-Modul braucht, aber nicht umgekehrt. Denn die GUI benutzt den Logik-Teil — die Logik soll aber die GUI nicht kennen müssen. Die muss auch ohne GUI funktionieren können, beziehungsweise sollte die GUI austauschbar sein.

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:36
von questlove
:D ich weis ;) ich hab aber nicht anders hinbekommen :/

Ja es kommt eigentlich keine, aber ich seh das bild auch nicht, das ich einfügen will.
Nur wenn ich in der zeile darunter iwas schreib (kann auch "gsbgusbutzhgzdgk" sein) dann bricht es da ab, es kommt die Fehlermeldung, dass er das wort nicht kennt, aber das bild ist sichtbar.

Mein problem also: ich will, dass es auch so sichtbar wird, ohne dass ich einen Fehler einbauen muss. Ich weis nicht an was es liegt dass sonst das bild nicht angezeigt wird.

Hoffe das ist jetzt einigermaßen verständlich ;)

@blackjack: danke für den hinweis. Ich habs auch erst in einem geschrieben jedoch musste ich es trennen, da es sonst schwieriger wird wenn ich auch noch mit mingus anfange und somit die logik "strukturiere". Ich habs anders versucht aber es ist mir iwie nicht gelungen. Was ihr meint ist, dass auch die GUI dann das modul ist, was man abspielen muss. Oder? Also sozusagen der hauptteil.

Re: Canvas

Verfasst: Dienstag 21. Juni 2011, 10:47
von Xynon1
@questlove
Hast du eigentlich die verlinkte Seite gelesen gehabt? - Dort steht eine fettgedruckte Notiz. Les die mal bitte, dann weißt du auch warum das Bild nicht angezeigt wird.

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 10:36
von questlove
Und was heist das jetz auf deutsch? Ichbkann des bild nur in einem label darstellen oder wie? Aber wieso? Ich versteh die note iwie nicht. Mit abbruch funktionierts doch..

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 10:51
von EyDu
questlove hat geschrieben:Und was heist das jetz auf deutsch? Ichbkann des bild nur in einem label darstellen oder wie? Aber wieso? Ich versteh die note iwie nicht. Mit abbruch funktionierts doch..
Dort steht, dass du das Bild an einen Namen binden musst, welcher noch existiert während die Hauptschleife läuft. Andernfalls wird es vom Garbage-Collector aufgeräumt.

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 13:01
von questlove
achso. Dankeschön

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 14:27
von questlove
jetzt funktionierts schon, aber wenn ich die Methode

Code: Alles auswählen

    def draw_key(self):

        sypos=165 + (self.zeile*90)
        
        Violinkey = tk.PhotoImage(file='vns_50.gif')
        self.image=Violinkey
        self.create_image(42,sypos,image=Violinkey)
        #x,y Position der Notenschluesselzeilen
        cxpos=32
        cypos=150 + (self.zeile*90)
        
        # Erstellen der Notenschluesselzeilen
        for i in xrange (5):
            y=cypos + (i*7)
            self.create_line(cxpos, y, self.left(), y)
nochmal aufrufe, um das bild woanders zu erstellen, verschwindet es an dem vorherigen Punkt. :/
Kann mir jemand erklären wie ich das jetzt machen muss, dass ich das Bild einfach an verschiedenen Orten erzeugen kann? Ich brauch das nämlich noch öfter für die Bilder der Noten zum Beispiel. Anscheinend komm ich mit der Sprache noch nicht so zurecht..

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 15:07
von BlackJack
@questlove: Wenn Du die Methode noch einmal aufrufst bindest Du ein neues Bildobjekt an `self.image`, womit natürlich das was da vorher dran gebunden wurde, nun nicht mehr von Python aus ansprechbar ist und damit der Speicher freigegeben werden kann. Wenn Du mehrere Bildobjekte erstellst, musst Du dir die *alle* irgendwo merken. Alternativ könntest Du auch mal versuchen ob es nicht günstiger wäre insgesamt nur *ein* Violinenschlüssel-Bildobjekt zu erzeugen und das wiederzuverwenden.

`image` ist vielleicht als Name auch ein wenig zu generisch. Und eigentlich sollte man es vermeiden Attribute ausserhalb der `__init__()` neu einzuführen. Da sollte man also alle Attribute zumindest zum Beispiel an `None` binden, falls man dort noch keinen anderen Wert zur Verfügung hat. In diesem Falle könnte man den Violinenschlüssel aber auch schon in der `__init__()` laden.

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 16:32
von questlove
das zweite klingt logisch. Ich habs auch schon geändert.
Aber wie hast du das gemeint mit "wiederverwenden"? wie soll das gehen?
ich muss es einfach beliebig oft an ieinem platz einfügen können. Genau so wie später die Noten....

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 16:37
von BlackJack
@questlove: Wiederverwenden: Halt nur *ein* `PhotoImage` aus dem GIF mit dem Violinenschlüssel erstellen und nicht jedes mal ein neues wenn ein Violinenschlüssel auf dem Canvas gesetzt werden soll.

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 16:44
von questlove
ja das wort hab ich schon verstanden. aber wie kann man das realisieren? :)

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 17:31
von BlackJack
@questlove: In dem man nicht bei jedem Aufruf der Funktion ein `PhotoImage` aus dem Violinenschlüssel-GIF erstellt, sondern nur einmal. Entweder dort, oder zum Beispiel in der `__init__()`.

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 17:42
von questlove
ja natürlich gehts dann, wenn ichn nur einen hab. aber wo krieg ich die anderen Notenschlüssel her? es werden bestimmt oft 10 oder mehr angezeigt. deshalb meine Frage: wie macht man das dass ein notenschlüssel von mir an einer bestimmten stelle angezeigt wird ohne dass man ihn neu erstellt, sondern dass er nur wie du sagst "wiederverwendet" wird.
Du erklärst immer nur dass ich ihn nur einmal erstellen muss, aber woher bekomme ich die andern her?

Re: Canvas

Verfasst: Mittwoch 22. Juni 2011, 20:41
von BlackJack
@questlove: Da wo Du ihn erstellst, musst Du ja eine Referenz darauf halten, damit er nicht einfach verschwindet. Und auf diese Referenz greifst Du dann wieder zurück. Du bindest das Objekt doch jetzt schon an ein Attribut (`image`).

Re: Canvas

Verfasst: Donnerstag 23. Juni 2011, 11:10
von questlove
Also praktisch so..
in der __init__():

Code: Alles auswählen

self.Violinkey = tk.PhotoImage(file='vns_50.gif')
und dan in der Funktion:

Code: Alles auswählen

def draw_key(self):

        sypos=165 + (self.zeile*90)
        
        self.image=self.Violinkey
        self.create_image(42,sypos,image=self.Violinkey)
        #x,y Position der Notenschluesselzeilen
oder? :)