如何解决将tkinter画布窗口移到其他小部件下方
我正在使用tk.Canvas的.create_window
在画布上放置按钮,以实现“滚动”效果,我可以在其中循环浏览按钮列表:
example
如gif所示,右侧有一个滚动条,它允许垂直滚动画布,并且可以循环浏览画布创建的按钮窗口。但是,如图所示,按钮与滚动条重叠。是否可以将窗口设置为仅出现在画布小部件内?更改按钮的主控按钮无效:
button = tk.Button(self,image=self.data[i].image,anchor='nw',width=400,height=72,highlightthickness=0,bd=0,relief='flat',bg='#dfdbda',compound='left',text="thing",fg='black',font='System,10')
buttonwindow = self.canvas.create_window(5,10,window=button)
无论给定哪些配置选项,该窗口似乎仍然从画布小部件中弹出。为什么这样做呢?有没有比create_window更好的替代方法,我可以在其中将按钮放在画布小部件中?
解决方法
解决方案很简单:不要将滚动条放在画布内。滚动条使用与画布相同的母版。另外,按钮必须是画布的子代。
由于您没有提供足够的代码来创建有效的示例,因此下面是一个人为的示例:
import tkinter as tk
class ButtonScroller(tk.Frame):
def __init__(self,parent,**kwargs):
super().__init__(parent,**kwargs)
self.canvas = tk.Canvas(self,bg="lightgray",bd=2,relief="groove")
self.vsb = tk.Scrollbar(self,orient="vertical",command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right",fill="y")
self.canvas.pack(side="left",fill="both",expand=True)
self.buttons = []
self.data = []
@property
def count(self):
return len(self.buttons)
def add_button(self,image,text):
bbox = self.canvas.bbox("all") or (0,0)
x,y = 4,bbox[3]+5
# use a fake image to keep the example simple...
self.data.append(image)
button = tk.Button(self.canvas,image=image,anchor='nw',width=400,height=72,highlightthickness=0,bd=0,relief='flat',bg='#dfdbda',compound='left',text=text,fg='black',font='System,10')
self.buttons.append(button)
self.canvas.create_window(x,y,anchor="nw",window=button)
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def add_button():
# create a dummy image to simplify this example
image = tk.PhotoImage(width=64,height=64)
n = buttonframe.count + 1
text = f"Button #{n}"
buttonframe.add_button(image,text)
root = tk.Tk()
buttonframe = ButtonScroller(root,bd=1,relief="raised")
toolbar = tk.Frame(root)
toolbar.pack(side="top",fill="x")
buttonframe.pack(side="top",expand=True)
add_button = tk.Button(toolbar,text="Add",command=add_button)
add_button.pack(side="left",padx=2,pady=2)
root.mainloop()
,
我发现的解决方案(滚动条从未在画布内): 我将按钮的母版集放到画布上,这将它们完全限制在该小部件上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。