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)
Wer weiß, wie dieses Problem beheben?
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
@xyz: Warum? Ich habe keine Ahnung. Diese Entscheidung wurde wahrscheinlich vor über 20 Jahren getroffen. –