【问题标题】:Text widgets inline in scrollable frame可滚动框架内嵌的文本小部件
【发布时间】:2017-06-19 11:34:48
【问题描述】:

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

我发现了一些在 Canvas 中不使用 pack 或 grid 的示例。但是,如果我使用场所布局,我的小部件就会消失。

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()

【问题讨论】:

  • 尝试在create_window()scrollregion 的设置之间调用self.update_idletasks()。我怀疑问题是在您调用bbox() 时,sensorsStatsFrame 还没有机会调整其大小以适应您添加到其中的两个Texts,因此您的画布的滚动区域结束高达 1x1 像素或类似的东西。
  • 它有效。谢谢。

标签: python tkinter


【解决方案1】:
我想水平对齐文本小部件,并能够左右滚动放置这些小部件的框架。

如果我没有误解你,你应该在你的代码中添加一个事件函数。

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()

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2021-06-08
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多