2016-10-22 6 views
1

Ich benutze Tkinter, um eine gescrollte Leinwand zu machen. Wenn ich ein Fenster mit create_window Verknüpfung mit einem Rahmen erstellen, der größer als die Leinwand ist, wird das Fenster mit der Grenze der Leinwand überlappen.Python Tkinter Canvas 'Grenze überlappen mit Fenster erstellen von `create_window'

import Tkinter as tk 


class ScrollCanvas(object): 
    """A widget to show table in frame""" 
    def __init__(self, parent=None): 
     self.parent = parent 
     self.frame = tk.Frame(self.parent, bd=3, 
           relief=tk.GROOVE) 
     self.frame.pack(fill=tk.BOTH, expand=1) 

     self.frame.grid_rowconfigure(0, weight=1) 
     self.frame.grid_columnconfigure(0, weight=1) 

     self.xscrollbar = tk.Scrollbar(self.frame, orient=tk.HORIZONTAL) 
     self.yscrollbar = tk.Scrollbar(self.frame, orient=tk.VERTICAL) 
     self.canvas = tk.Canvas(self.frame, bg='#006666', 
           bd=10, relief=tk.GROOVE, 
           xscrollcommand=self.xscrollbar.set, 
           yscrollcommand=self.yscrollbar.set) 

     self.xscrollbar.grid(row=1, column=0, sticky=tk.W+tk.E) 
     self.yscrollbar.grid(row=0, column=1, sticky=tk.N+tk.S) 
     self.canvas.grid(row=0, column=0, sticky=tk.W+tk.E+tk.N+tk.S) 

     self.xscrollbar.config(command=self.canvas.xview) 
     self.yscrollbar.config(command=self.canvas.yview) 

     self.table = tk.Frame(self.canvas, bd=5, relief=tk.SOLID, 
           width=400, height=200) 

     self.canvas.create_window(0, 0, anchor=tk.CENTER, window=self.table) 
     self.canvas.update_idletasks() 
     self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL)) 


def main(): 
    app = tk.Tk() 
    app.geometry('400x300') 
    frame = tk.Frame(app, width=50, height=50) 
    frame.propagate(0) 
    frame.pack(fill=tk.BOTH, expand=1) 
    mytable = ScrollCanvas(parent=frame) 
    app.mainloop() 

main() 

Das Ergebnis ist wie folgt: (rote Box)

enter image description here

Wer weiß, wie dieses Problem beheben?

Antwort

1

Seltsamerweise ist der Canvas-Rahmen Teil des Zeichenraums, sodass alles, was auf der Leinwand gezeichnet wird, die Grenzen überlappen kann.

Die Lösung, die ich verwende, ist, den Rahmen aus der Leinwand zu entfernen, und dann die Leinwand in einem Rahmen, der einen Rahmen hat. Visuell sieht es genauso aus, aber da der sichtbare Rahmen zu einem anderen Widget gehört, ist es unmöglich, dass Elemente in der Leinwand ihn überlappen.

+0

Vielen Dank für Ihre Antwort. Setzen Sie die Leinwand in einen Rahmen, um dieses Problem zu vermeiden. Aber warum ist die Leinwandgrenze Teil des Zeichenraums? – xyz

+0

@xyz: Warum? Ich habe keine Ahnung. Diese Entscheidung wurde wahrscheinlich vor über 20 Jahren getroffen. –

Verwandte Themen