Tkinter Fensterinhalt mit Fenstergröße skalieren

Fragen zu Tkinter.
Antworten
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Hallo ich suche nach einer Möglichkeit meine gezeichneten Kreise und linien (Spielbrett) dynamisch su verändern. Wenn ich das Fenster an der Ecke größer ziehe, soll auch der Inhalt entsprechend größer werden. Dazu müsste ich das Event des Ziehens abfangen und dann einmal nachfragen wie groß es jetzt ist. Wisst ihr wie das geht?

MfG
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

iceman21 hat geschrieben:Hallo ich suche nach einer Möglichkeit meine gezeichneten Kreise und linien (Spielbrett) dynamisch su verändern. Wenn ich das Fenster an der Ecke größer ziehe, soll auch der Inhalt entsprechend größer werden. Dazu müsste ich das Event des Ziehens abfangen und dann einmal nachfragen wie groß es jetzt ist. Wisst ihr wie das geht?
Du ermittelst die Größe des Canvas über die Methoden winfo_width() und winfo_height(), das Event, das beim Verändern der Fenstergröße ausgelöst wird, heißt "<Configure>", und die Canvas-Methode scale() kennst du wahrscheinlich.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo iceman21

Hier ein kleines 'Kick Off' Beispiel:

Code: Alles auswählen

# Skriptname: scaleable_canvas_obj_01.py

import Tkinter as tk

def update_graph_obj(event):
    """Skaliere Grafik-Objekte"""

    canvas_obj = event.widget
    new_canvas_width = canvas_obj.winfo_width()
    new_canvas_height = canvas_obj.winfo_height()
    xscale_fac = float(new_canvas_width) / float(canvas_obj.width)
    yscale_fac = float(new_canvas_height) / float(canvas_obj.height)
    canvas_obj.width, canvas_obj.height = (new_canvas_width, new_canvas_height)

    canvas_obj.scale('graph_obj', 0, 0, xscale_fac, yscale_fac)

def main():

    #~~ Erstelle Hauptfenster
    app_win = tk.Tk()

    xpos = 20
    ypos = 20
    width = 200
    height = 200

    #~~ Erstelle die Canvas-Flaeche
    canvas = tk.Canvas(app_win, bd=0, highlightthickness=0, width=width,
        height=height, bg='steelblue')
    canvas.pack(side='left', fill='both', expand='yes')
    canvas.bind('<Configure>', update_graph_obj)

    canvas.width = width
    canvas.height = height

    #~~ Erstelle vier Grafik-Objekte (Rechtecke)
    for obj_nr in xrange(4):
        offset = obj_nr * 10
        canvas.create_rectangle(xpos+offset, ypos+offset, 100+offset,
            100+offset, fill='yellow', tags='graph_obj')

    #~~ Erstelle ein Kreis-Objekt
    x = 90
    y = 90
    rad = 30
    canvas.create_oval(x-rad, y-rad, x+rad, y+rad, stipple='gray50',
        width=0, fill='red', tags='graph_obj')

    app_win.mainloop()

main()
Gruss wuf :wink:
Take it easy Mates!
Antworten