Ich werde mal mein Programm dokumentieren und dann nochmal hochladen.
Zu deinem Problem:
- Arbeite nicht mit "place"-Methoden das ist sowas von altmodisch und ohne Designer reine Folter. Nimm am besten nur "pack"-Methoden und sie mal wie weit du kommst.
- Lass niemals das Widget sich selbst auf sein Eltern-Widget packen. So kann man als Nutzer von diesem Widget nicht mehr den Geometry-Manager bestimmen.
- Man kann es nicht oft genug sagen: Halte dich an PEP8.
So könnte man es z.B. machen:
Code: Alles auswählen
#!/usr/bin/env python
import Tkinter as tk
class DarstellungsFenster(tk.Canvas):
def __init__(self, master, cnf={}):
# bedenke das border, relief und background so Standard sind
# und deine Werte die du in 'cnf' übergibst eventuell überschreibst
tk.Canvas.__init__(self, master, cnf, border=4, relief='ridge',
background='white')
def hauptprogramm():
wurzel = tk.Tk()
breite, hoehe = 800, 600
x, y = 0, 0
wurzel.geometry('%dx%d+%d+%d' % (breite, hoehe, x, y))
wurzel.title('Notationsprogramm')
darstellungsfenster = DarstellungsFenster(wurzel, dict(width=715, height=515))
# expand sorgt dafuer das dein Widget immer genauso gross ist wie dein
# wurzel-Fenster
darstellungsfenster.pack(expand=True, fill="both")
# Sonst wird der Code auch bei einem Import aufgerufen
if __name__ == "__main__":
hauptprogramm()
Da die Dokumentation bei effbot ein paar Stellen leider etwas unschön ist, hier mal noch eine schnelle Kurzbeschreibung von mir.
"position" - ist immer ein Punkt der bei Bildern oder Widgets immer die obere linke Ecke repräsentiert
"coords" - sind zwei oder mehrere Punkte die miteinander verbunden werden
"bbox" - sind immer zwei Punkte die ein Rechteck bilden, also ein Punkt für links oben und einen für rechts unten. In diesem Rechteck
Der Rest sind optionale Parameter und können mit func(..., keyword0=value, keyword1=value) der Funktion übermittelt werden.
So stellt sich nun folgendes zusammen:
# positions
create_bitmap(x, y) - erzeugt eine Bitmap
create_text(x, y) - erzeugt einen Text
create_window(x, y) - erzeugt ein widget auf dem Canvas, z.B. nötig wenn du die Buttons mit dem Canvas ausdrucken möchtest.
create_image(x, y) - erzeugt ein beliebiges Bild, unterschied zur Bitmap ist nur das man jedes Bildformat nutzen kann, wenn man "PIL.ImageTk"-Objekte nimmt. Die Bitmap kann zudem noch beim zeichnen verändert werden z.B. Vordergrundfarbe
# coords
create_line(x0, y0, x1, y1): - hatte ich oben schon beschrieben
create_polygon(x0, y0, x1, y1,..., xn, yn) - akzeptiert beliebig viele Punkte die in der Reihenfolge, in welcher man sie übergibt verbunden werden.
# bbox
create_arc(x0, y0, x1, y1) - zeichnet einen Kreisausschnitt/bogen in das Rechteck was durch die Punkte ensteht. "start" und "extent" beschreiben wo der Kreis beginnen und um wie viel Grad er sich neigen soll. z.B. create_arc(10, 10, 110, 110, start=0, extent=180) würde einen 100 Pixel im Durchmesser großen oberen Halbkreis erzeugen. Zu beachten ist 0 entspricht Rechts nicht oben und der Winkel ist entgegen dem Uhrzeigersinn.
create_rectanglel(x0, y0, x1, y1) - sollte ja jetzt nicht schwer fallen
create_oval(x0, y0, x1, y1) - und hier nochmal genau das gleiche nur das ein Oval in der bbox erzeugt wird. Die Box ist einfach nur die Begrenzung. Hier ist "joinstyle" für die Noten eventuell interessant die Möglichkeiten sind dort "miter", "bevel", oder "round", welches Standard ist. Damit kann man bestimmen wie die Punkte die bei zeichnen des Ovals erzeugt werden verbunden werden sollen.
Es gibt noch zahlreiche andere Optionen die mit angegeben werden können, hierzu sieht man am besten direkt in die
Tk-Dokumentation.