Python 可滚动框架中的内联文本小部件

Python 可滚动框架中的内联文本小部件,python,tkinter,Python,Tkinter,我想水平对齐文本小部件,并能够左右滚动放置这些小部件的框架。下面的代码几乎就是我想要的,只是我的滚动条不工作 我发现了一些例子,其中说在画布中不使用pack或grid。然而,如果我使用PlaceLayout,我的小部件就会被破坏 from tkinter import * class MainView(Frame): def __init__(self, *args, **kwargs): Frame.__init__(self, *args, **kwargs)

我想水平对齐文本小部件,并能够左右滚动放置这些小部件的框架。下面的代码几乎就是我想要的,只是我的滚动条不工作

我发现了一些例子,其中说在画布中不使用pack或grid。然而,如果我使用PlaceLayout,我的小部件就会被破坏

from tkinter import *


class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        self.canvas = Canvas(self)
        self.sensorsStatsFrame = Frame(self.canvas)
        myscrollbar = Scrollbar(self,orient=HORIZONTAL,command=self.canvas.xview)
        myscrollbar.pack(side=BOTTOM,fill=X)
        self.canvas.configure(xscrollcommand=myscrollbar.set)
        self.canvas.pack(side=TOP, fill=BOTH)

        test0 = Text(self.sensorsStatsFrame, bg="red", state=DISABLED, width=150)
        test1 = Text(self.sensorsStatsFrame, bg="green")
        test0.pack(side=LEFT)
        test1.pack(side=LEFT)

        self.canvas.create_window((0,0),window=self.sensorsStatsFrame,anchor='nw')
        self.canvas.config(scrollregion=self.canvas.bbox("all"))


if __name__ == "__main__":
    root = Tk()
    main = MainView(root)
    main.pack(fill="both", expand=1)
    root.wm_geometry("1100x500")
    root.wm_title("MongoDB Timed Sample Generator")
    root.mainloop()
我想水平对齐文本小部件,并能够左右滚动放置这些小部件的框架。 如果我没有误解您的意思,您应该在代码中添加一个事件函数

from tkinter import *


class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        self.canvas = Canvas(self)
        self.sensorsStatsFrame = Frame(self.canvas)
        myscrollbar = Scrollbar(self,orient=HORIZONTAL,command=self.canvas.xview)
        myscrollbar.pack(side=BOTTOM,fill=X)
        self.canvas.configure(xscrollcommand=myscrollbar.set)
        self.canvas.pack(side=TOP, fill=BOTH)

        test0 = Text(self.sensorsStatsFrame, bg="red", state=DISABLED, width=150)
        test1 = Text(self.sensorsStatsFrame, bg="green")
        test0.pack(side=LEFT)
        test1.pack(side=LEFT)

        self.canvas.create_window((0,0),window=self.sensorsStatsFrame,anchor='nw')
# Call the function like the below.
        self.sensorsStatsFrame.bind("<Configure>", self.onFrameConfigure)
# Add below function to your codes.
    def onFrameConfigure(self, event):
        self.canvas.config(scrollregion=self.canvas.bbox("all"))


if __name__ == "__main__":
    root = Tk()
    main = MainView(root)
    main.pack(fill="both", expand=1)
    root.wm_geometry("1100x500")
    root.wm_title("MongoDB Timed Sample Generator")
    root.mainloop()
从tkinter导入*
类主视图(框架):
定义初始化(self,*args,**kwargs):
帧._uu初始化(self,*args,**kwargs)
self.canvas=画布(self)
self.sensorsStatsFrame=帧(self.canvas)
myscrollbar=Scrollbar(self,orient=HORIZONTAL,command=self.canvas.xview)
myscrollbar.pack(侧面=底部,填充=X)
self.canvas.configure(xscrollcommand=myscrollbar.set)
self.canvas.pack(side=TOP,fill=BOTH)
test0=文本(self.sensorsStatsFrame,bg=“红色”,状态=禁用,宽度=150)
test1=文本(self.sensorsStatsFrame,bg=“绿色”)
test0.pack(侧=左)
测试1.组件(侧=左)
self.canvas.create_window((0,0),window=self.sensorsStatsFrame,anchor='nw')
#按如下方式调用函数。
self.sensorsStatsFrame.bind(“,self.onFrameConfigure)
#将以下功能添加到代码中。
def onFrameConfigure(自我,事件):
self.canvas.config(scrollregion=self.canvas.bbox(“全部”))
如果名称=“\uuuuu main\uuuuuuuu”:
root=Tk()
main=MainView(根目录)
main.pack(fill=“both”,expand=1)
root.wm_几何体(“1100x500”)
root.wm_标题(“MongoDB定时样本生成器”)
root.mainloop()

尝试在
创建窗口()和
滚动区域设置之间调用
self.update\u idletasks()
。我怀疑问题在于,在您调用
bbox()
时,
传感器状态帧
还没有机会调整其大小以适应您添加到其中的两个
文本,因此画布的滚动区域最终为1x1像素或类似的大小。它可以工作。谢谢