【问题标题】:How to create a GUI with scroll-able text widgets如何创建带有可滚动文本小部件的 GUI
【发布时间】:2018-04-07 13:37:27
【问题描述】:

我想创建一个底部有水平滚动条的主窗口。

然后这个主窗口应该包含不确定数量的带有垂直滚动条的较小文本小部件。

下面的代码将 10 个滚动文本小部件打包成一个更大的文本小部件。

我的问题是“尝试”使用window_frame.pack(side="left", fill="both", expand=True) 来放置文本小部件。这给了我想要的高度(全屏),但我失去了水平滚动条的使用,并且所有十个小部件都不可见。

在第二次尝试中,我使用了text_box.window_create("1.0", window=window_frame),水平滚动条有效,我可以查看所有 10 个文本小部件,但我不知道如何让它们在垂直轴上填满屏幕。

有什么方法可以实现水平滚动功能并使文本小部件处于全屏高度(不测量字体大小)?

或者我是否以完全错误的方式处理这个问题?

这是该问题的可行且简化的版本。只需点击 Escape 即可摧毁窗户。

import tkinter as tk
from tkinter import ttk
import tkinter.scrolledtext as St

root = tk.Tk()
root.bind("<Escape>", exit)
root.wm_attributes("-fullscreen", True)
#Mother Text Box to hold the windows
f = tk.Frame(root, background = "black")
f.pack(fill="both", expand=True)
vbar = ttk.Scrollbar(f, orient="horizontal")
text_box = tk.Text(f, xscrollcommand=vbar.set, wrap=tk.NONE, border=0, borderwidth=0)
text_box.pack(fill="both", expand=1)
vbar.pack(fill="x", side="bottom", pady=0)
vbar.config(command=text_box.xview)

window_frame = tk.Frame(text_box, background="yellow")

# This is attempt one #
#window_frame.pack(side="left", fill="both", expand=True)

# This is attempt two #
text_box.window_create("1.0", window=window_frame)

window_frame.configure(pady=2, padx=2)

text_box_list = []

for n in range(0, 10):
    text_box_list.append(St.ScrolledText(window_frame))
    text_box_list[n].pack(side="left", fill="both", expand=True)

root.mainloop()

def exit(root, event):
    root.destroy()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    看看这个例子:

    import tkinter as tk
    import tkinter.scrolledtext as St
    
    class Example(tk.Frame):
        def __init__(self, root):
            tk.Frame.__init__(self, root)
            self.pack(side="top", fill="both", expand=True)
            self.canvas = tk.Canvas(self, borderwidth=0)
            self.hbar = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
            self.canvas.configure(xscrollcommand=self.hbar.set)
    
            self.canvas.pack(side="top", fill="both", expand=True)
            self.hbar.pack(side="bottom", fill="x")
            self.window_frame = tk.Frame(self.canvas)
            self.window_id = self.canvas.create_window((4,4), window=self.window_frame, anchor="ne")
            self.window_frame.bind("<Configure>", self.onFrameConfigure)
            self.canvas.bind("<Configure>", self.onCanvasConfigure)
    
            self.text_box_list = []
            for n in range(10):
                tb = St.ScrolledText(self.window_frame)
                tb.pack(side="left", fill='both', expand=True)
                self.text_box_list.append(tb)
    
            self.canvas.update_idletasks()      # refresh canvas
    
        def onFrameConfigure(self, event):
            '''Reset the scroll region to encompass the inner frame'''
            self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    
        def onCanvasConfigure(self, event):
            '''Set inner windowed frame to same height as canvas'''
            self.canvas.itemconfig(self.window_id, height=event.height)
    
    if __name__ == "__main__":
        root=tk.Tk()
        root.geometry('1000x500+0+0')
        root.bind("<Escape>", exit)
        Example(root).pack(side="top", fill="both", expand=True)
        root.mainloop()
    

    我在这里使用tk.Canvas.create_window 而不是tk.Text.window_create。但主要区别在于我更新了滚动区域并在调整大小时将内部窗口高度显式设置为画布高度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多