Я создаю GUI, используя python 3.7. Интерфейс включает холст и полосу прокрутки.
Я использую update_idletasks (), чтобы определить область прокрутки для холста. Я получаю нужный виджет, но это приводит к тому, что холст выдает раздражающий fla sh при вызове. Я не нашел никакой документации или справки, описывающей и решающей эту проблему. Я надеюсь, что кто-то нашел способ обойти это.
Я включил небольшой пример, который можно запустить и воспроизвести проблему
#! /Library/Frameworks/Python.framework/Versions/3.7/bin/python3
import tkinter as tk
from tkinter import *
class App(tk.Frame) :
def __init__(self,root=None) :
master = root
self.master = master
Frame.__init__(self,master)
master.title("TITLE")
canvas = self.CreateCanvas(master)
canvas.grid(row=0,column=0)
def CreateCanvas(self,parent) :
# Create a frame for the canvas and scrollbar(s).
canvasframe = Frame(parent,relief='ridge',bd=2)
canvasframe.grid(row=1,column=0,sticky="news",padx=10,pady=10)
label=Label(canvasframe,text="Example")
label.grid(row=0,column=0,sticky=E+W,pady=10)
# Add a canvas in the frame.
canvas = tk.Canvas(canvasframe)
canvas.grid(row=1, column=0,sticky='nesw')
# Create a vertical scrollbar linked to the canvas.
vsbar = tk.Scrollbar(canvasframe, orient=tk.VERTICAL, command=canvas.yview)
vsbar.grid(row=1, column=1, sticky=tk.NS)
canvas.configure(yscrollcommand=vsbar.set)
# Create a frame on the canvas to contain the buttons.
buttons = tk.Frame(canvas, bd=2)
# Make some arbitrary buttons
for x in range(10) :
for y in range(10) :
text = "(" + str(x) + "," + str(y) + ")"
button=Button(buttons,text=text)
button.grid(row=y,column=x)
# Create canvas window to hold them
canvas.create_window((0,0), window=buttons, anchor=tk.NW)
canvas.update_idletasks() # Needed to make bbox info available.
bbox = canvas.bbox(tk.ALL) # Get bounding box of canvas with Buttons.
#Number of rows, and columns to display
rows = 5
cols = 10
# Define the scrollable region as entire canvas with only the desired
# number of rows and columns displayed.
w, h = bbox[2]-bbox[1], bbox[3]-bbox[1]
dw, dh = int((w/cols * cols)), int((h/rows))
canvas.configure(scrollregion=bbox, width=dw, height=dh)
return(canvasframe)
root = tk.Tk()
app = App(root)
app.mainloop()