繁体   English   中英

尝试在 python 中创建可滚动框架时发生 _tkinter.TclError

[英]A _tkinter.TclError occured while trying to make a scrollable frame in python

所以我一直在尝试制作一个可滚动的框架。 我一直在搜索,这三个影响最大:
https://stackoverflow.com/questions/16188420/tkinter-scrollbar-for-frame\ https://stackoverflow.com/questions/3085696/adding-of-a-scrollbar-in-widget-group tkinter\ 如何在 Tkinter 中获得带有滚动条的框架?

我想出了以下代码:

from tkinter import *

class Test_tk_stuff():
    def __init__(self):
        self.screen = Tk()
        self.screen.geometry("500x500")

        self.structure()

        self.screen.mainloop()

    def scroller(self, canvas):
        canvas.configure(scrollregion = canvas.bbox("all"))

    def frame_expander(self, event):
        canvas_width = event.width
        self.canvas.itemconfig(self.frame, width = canvas_width)

    def structure(self):
        parent = Frame(self.screen)
        parent.pack(expand = True, fill = BOTH)
        
        self.canvas = Canvas(parent, bg = "green", highlightthickness = 0, relief = RAISED)
        self.frame = Frame(self.canvas, bg = "blue")

        myscrollbar = Scrollbar(parent, orient = "vertical", command = self.canvas.yview)
        self.canvas.configure(yscrollcommand = myscrollbar.set)

        myscrollbar.pack(side = RIGHT, fill = Y)

        self.canvas.pack(side = LEFT, fill = BOTH, expand = True)

        self.canvas.create_window((0, 0), window = self.frame)
        # can't do: self.frame.pack(expand = True, fill = BOTH) because it will become unscrollable

        # Event Bind        
        self.frame.bind("<Configure>", lambda event, canvas = self.canvas: self.scroller(self.canvas))
        self.canvas.bind("<Configure>", self.frame_expander)

        # initialize number of minimum columns
        for num_columns in range(3):
            self.frame.columnconfigure(num_columns, weight = 1)

        a = "Button Text!"

        # fill it to - 1.) test scrollbar 2.) actually using the frame inside
        for place2 in range(10):
            Button(self.frame, text = a, bg = "black", fg = "white").grid(row = place2, column = 1, sticky = "NSEW", ipady = 15)

if __name__ == "__main__":
    Test_tk_stuff()

但不知何故,当我运行它时,它显示了一个 _tkinter.TclError。 我尝试搜索那是什么以及如何修复它,但是,如您所见,我无法修复它。

我的实现有问题吗? 提前致谢。

使用self.frame.config(width=canvas_width)代替canvas.itemconfig()

canvas.itemconfig() is used on canvas item returned by canvas.create_xxxxx() functions, not on tkinter widget ( self.frame ).

保存 self.frame 的 canvas 项目 ID 并在self.frame canvas.itemconfig()中使用它:


def frame_expander(self, event):
    canvas_width = event.width
    self.canvas.itemconfig(self.frame_item, width=canvas_width)

def structure(self):
    ...
    self.frame_item = self.canvas.create_window((0, 0), window = self.frame)
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM