gpt4 book ai didi

python - 滚动笔记本选项卡 Tkinter

转载 作者:行者123 更新时间:2023-12-01 01:47:30 24 4
gpt4 key购买 nike

我想制作很多笔记本选项卡,我想将它们放在 Canvas 中并添加水平滚动条,以便我可以滚动它们。我设置了 Canvas 大小,但当我添加新选项卡时 Canvas 大小不断变化。另外,滚动条不起作用,你能告诉我我做错了什么吗?

该程序没有向我显示任何错误。这是代码:

from tkinter import *
from tkinter import ttk

myApp = Tk()
myApp.title(" Program ")
myApp.geometry("900x500")

CanvasTabs = Canvas(myApp, width=50, height=50)
CanvasTabs.grid(row=0,column=0)

tabs = ttk.Notebook(CanvasTabs, width=100, height=100)

tab1 = ttk.Frame(tabs)
tabs.add(tab1,text=" Tab 1 ")

tab2 = ttk.Frame(tabs)
tabs.add(tab2,text=" Tab 2 ")

tab3 = ttk.Frame(tabs)
tabs.add(tab3,text=" Tab 3 ")

tab4 = ttk.Frame(tabs)
tabs.add(tab4,text=" Tab 4 ")


hbar=Scrollbar(CanvasTabs,orient=HORIZONTAL)
hbar.pack(side=TOP,fill=X)
hbar.config(command=CanvasTabs.xview)

CanvasTabs.config(xscrollcommand=hbar.set)


tabs.pack(expand=1, fill="both")

myApp.mainloop()

最佳答案

我编写了一个小部件来解决该问题。这是一个真正的解决方案: https://github.com/muhammeteminturgut/ttkScrollableNotebook

Demonstration

# -*- coding: utf-8 -*-

# Copyright (c) Muhammet Emin TURGUT 2020
# For license see LICENSE
from tkinter import *
from tkinter import ttk

class ScrollableNotebook(ttk.Frame):
def __init__(self,parent,*args,**kwargs):
ttk.Frame.__init__(self, parent, *args)
self.xLocation = 0
self.notebookContent = ttk.Notebook(self,**kwargs)
self.notebookContent.pack(fill="both", expand=True)

self.notebookTab = ttk.Notebook(self,**kwargs)
self.notebookTab.bind("<<NotebookTabChanged>>",self._tabChanger)

slideFrame = ttk.Frame(self)
slideFrame.place(relx=1.0, x=0, y=1, anchor=NE)
leftArrow = ttk.Label(slideFrame, text="\u25c0")
leftArrow.bind("<1>",self._leftSlide)
leftArrow.pack(side=LEFT)
rightArrow = ttk.Label(slideFrame, text=" \u25b6")
rightArrow.bind("<1>",self._rightSlide)
rightArrow.pack(side=RIGHT)
self.notebookContent.bind( "<Configure>", self._resetSlide)

def _tabChanger(self,event):
self.notebookContent.select(self.notebookTab.index("current"))

def _rightSlide(self,event):
if self.notebookTab.winfo_width()>self.notebookContent.winfo_width()-30:
if (self.notebookContent.winfo_width()-(self.notebookTab.winfo_width()+self.notebookTab.winfo_x()))<=35:
self.xLocation-=20
self.notebookTab.place(x=self.xLocation,y=0)
def _leftSlide(self,event):
if not self.notebookTab.winfo_x()== 0:
self.xLocation+=20
self.notebookTab.place(x=self.xLocation,y=0)

def _resetSlide(self,event):
self.notebookTab.place(x=0,y=0)
self.xLocation = 0

def add(self,frame,**kwargs):
if len(self.notebookTab.winfo_children())!=0:
self.notebookContent.add(frame, text="",state="hidden")
else:
self.notebookContent.add(frame, text="")
self.notebookTab.add(ttk.Frame(self.notebookTab),**kwargs)

def forget(self,tab_id):
self.notebookContent.forget(tab_id)
self.notebookTab.forget(tab_id)

def hide(self,tab_id):
self.notebookContent.hide(tab_id)
self.notebookTab.hide(tab_id)

def identify(self,x, y):
return self.notebookTab.identify(x,y)

def index(self,tab_id):
return self.notebookTab.index(tab_id)

def insert(self,pos,frame, **kwargs):
self.notebookContent.insert(pos,frame, **kwargs)
self.notebookTab.insert(pos,frame,**kwargs)

def select(self,tab_id):
self.notebookContent.select(tab_id)
self.notebookTab.select(tab_id)

def tab(self,tab_id, option=None, **kwargs):
return self.notebookTab.tab(tab_id, option=None, **kwargs)

def tabs(self):
return self.notebookContent.tabs()

def enable_traversal(self):
self.notebookContent.enable_traversal()
self.notebookTab.enable_traversal()

关于python - 滚动笔记本选项卡 Tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51105771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com