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?
Canvas
@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()`).
@questlove
Ist jetzt aber nicht logisch, das sich die Hauptschleife der GUI in der Logik versteckt.
Was für eine Fehlermeldung kommt denn?
Ist jetzt aber nicht logisch, das sich die Hauptschleife der GUI in der Logik versteckt.

Was für eine Fehlermeldung kommt denn?
@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.

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.


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.
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.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..
Das Leben ist wie ein Tennisball.
jetzt funktionierts schon, aber wenn ich die Methode
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..
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)
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..
@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.
`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.
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....
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....
@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.
@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__()`.
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?
Du erklärst immer nur dass ich ihn nur einmal erstellen muss, aber woher bekomme ich die andern her?
@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`).
Also praktisch so..
in der __init__():
und dan in der Funktion:
oder? 
in der __init__():
Code: Alles auswählen
self.Violinkey = tk.PhotoImage(file='vns_50.gif')
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
