gpt4 book ai didi

python - 如何创建带有可滚动文本小部件的 GUI

转载 作者:行者123 更新时间:2023-12-01 09:33:52 28 4
gpt4 key购买 nike

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

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

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

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

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

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

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

这是该问题的一个可行且简化的版本。只需按 Esc 键即可销毁窗口。

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

最佳答案

看一下这个例子:

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。但主要区别在于我更新了滚动区域并在调整大小时显式地将内部窗口高度设置为 Canvas 高度。

关于python - 如何创建带有可滚动文本小部件的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707951/

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