ich möchte, dass sich ein canvas dynamisch skaliert, wenn ich die Fenstergröße anpasse. Ich habe noch nicht besonders viel Ahnung von Tkinter und habe das Internet nach einer Lösung durchforstet. Gefunden habe ich das:
https://stackoverflow.com/questions/228 ... ndow-width
Nun habe ich aber noch eine Bedingung, die hier nicht erfüllt ist. Das canvas soll seine Proportionen beibehalten. Also habe ich versucht den Code anzupassen und habe folgendes Resultat erzielt:
Code: Alles auswählen
from tkinter import *
# a subclass of Canvas for dealing with resizing of windows
class ResizingCanvas(Canvas):
def __init__(self,parent,**kwargs):
Canvas.__init__(self,parent,**kwargs)
self.bind("<Configure>", self.on_resize)
self.height = self.winfo_reqheight()
self.width = self.winfo_reqwidth()
self.initial_ratio = self.width/self.height
def on_resize(self,event):
# determine the ratio of old width/height to new width/height
wscale = float(event.width)/self.width
hscale = float(event.height)/self.height
self.width = event.width
self.height = event.height
# resize the canvas
self.config(width=self.height, height=self.height)
# rescale all the objects tagged with the "all" tag
if (self.width/self.height) > self.initial_ratio:
self.scale("all",0,0,hscale,hscale)
print("1")
elif (self.width/self.height) < self.initial_ratio:
self.scale("all",0,0,wscale,wscale)
print("2")
elif (self.width/self.height) == self.initial_ratio:
self.scale("all",0,0,hscale,wscale)
print("3")
def main():
root = Tk()
myframe = Frame(root)
myframe.pack(fill=BOTH, expand=YES)
mycanvas = ResizingCanvas(myframe,width=850, height=400, bg="red", highlightthickness=0)
mycanvas.pack(fill=BOTH, expand=YES)
# add some widgets to the canvas
mycanvas.create_line(0, 0, 850, 400)
mycanvas.create_rectangle(50, 25, 150, 75, fill="blue")
# tag all of the drawn widgets
mycanvas.addtag_all("all")
root.mainloop()
if __name__ == "__main__":
main()
Nun verstehe ich überhaupt nicht, was hier passiert. Um das nachzuvollziehen, lasse ich mir die Nummer des if/elif-Zweiges ausgeben, dessen Bedingung erfüllt ist. Bereits zum Start wird bemerkt, dass das Seitenverhältnis dem Seitenverhältnis zu Beginn entspricht. Soweit nachvollziehbar. Dann bemerkt er, dass das Seitenverhältnis kleiner als das ursprüngliche ist, ohne dass der Anwender etwas dazu beigetragen hätte. Das verstehe ich nicht. Die Anzeige, die ich zu Gesicht bekomme ist dann auch quadratisch, die diagonale Linie endet nicht in der Ecke sondern in der Mitte der senkrechten Begrenzung.
Wenn ich ich das Fenster mit der Maus packe und die Größe änder, passiert dann wenigstens das, was ich gerne hätte. Aber auch nich so wirklich, denn Diagonale und Rechteck schrumpfen.
Ich verstehs nicht. :K Kann mir jemand auf die Sprünge helfen?
Und eine Frage am Rande: Wie packe ich meinen Code in die Codebox mit Syntax-Highlighting? Dann muss BlackJack das nicht immer für mich übernehmen...