[英]A _tkinter.TclError occured while trying to make a scrollable frame in python
So I have been trying to make a scrollable frame.所以我一直在尝试制作一个可滚动的框架。 I've had been searching and these 3 had the most impact:
我一直在搜索,这三个影响最大:
https://stackoverflow.com/questions/16188420/tkinter-scrollbar-for-frame\ https://stackoverflow.com/questions/3085696/adding-a-scrollbar-to-a-group-of-widgets-in-tkinter\ How could I get a Frame with a scrollbar in Tkinter? https://stackoverflow.com/questions/16188420/tkinter-scrollbar-for-frame\ https://stackoverflow.com/questions/3085696/adding-of-a-scrollbar-in-widget-group tkinter\ 如何在 Tkinter 中获得带有滚动条的框架?
And I have come up with the following code:我想出了以下代码:
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()
But somehow when I run it, it shows a _tkinter.TclError.但不知何故,当我运行它时,它显示了一个 _tkinter.TclError。 I tried searching what that is and how to fix it, but, as you can see, I wasn't able to fix it.
我尝试搜索那是什么以及如何修复它,但是,如您所见,我无法修复它。
Is there something wrong with my implementation?我的实现有问题吗? Thanks in advance.
提前致谢。
use self.frame.config(width=canvas_width)
instead of canvas.itemconfig()
使用
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
). canvas.itemconfig()
is used on canvas item returned by canvas.create_xxxxx()
functions, not on tkinter widget ( self.frame
).
Save the canvas item ID for the self.frame
and use it in canvas.itemconfig()
:保存 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.