下面的代码应该是一个大的Text
窗口小部件,其中包含一个可嵌入的Text
网格化的可变数量较小的Frame
窗口小部件。由于Text
窗口小部件高度是以行为单位测量的,我希望使用Text
使内部Frame
窗口小部件粘贴到sticky
的垂直边框(以像素为单位)它会适应不同的显示器尺寸。
我在下面的代码中遇到两个问题。一个是屏幕分辨率。
self.winfo_screenheight()
给我一个72像素太高的高度 - 窗口的底部离开屏幕。我不得不手动调整它以使其适合。这与Tkinter窗口标题有关吗?我假设72个像素在监视器之间不一致。我该如何动态调整呢?
其次,我已将嵌入式Frame
设置为propagate(0)
但是当添加内部Text
窗口小部件时,它会缩小回默认大小。如果您在中途取消注释return
命令,则可以看到它在添加Text小部件之前垂直填充屏幕。我假设通过使用
Frame
self.text_box.window_create(tk.END, window = self.win_frame)
传播的window
而不是Frame
。
有没有解决这些问题的方法。任何见解都会有所帮助。
这是代码。
import tkinter as tk
from tkinter import ttk
import tkinter.scrolledtext as St
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.num_win = 7
self.win_width = 40
#Set up the root window Note the -72 hack to get it to fit
self.screen_height = self.winfo_screenheight() - 72
self.screen_width = self.winfo_screenwidth()
self.geometry("{}x{}+-10+-0".format(self.screen_width, self.screen_height))
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
#Set up the mother Text widget that will hold the smaller ones
self.vbar = ttk.Scrollbar(self, orient="horizontal")
self.vbar.grid(column=0, row=2, sticky="EW")
self.text_box = tk.Text(self, xscrollcommand=self.vbar.set, wrap=tk.NONE)
self.text_box.grid(column=0, row=0, padx=(5, 5), sticky="NESW")
self.vbar.config(command=self.text_box.xview)
self.text_box.propagate(0)
#Set up the Frame to grid the internal widgets to.
self.win_frame = ttk.Frame(self.text_box, width = self.win_width * self.num_win, height =
self.screen_height)
self.win_frame.propagate(0)
self.text_box.window_create(tk.END, window = self.win_frame)
#return
#Set up the internal text widgets
self.internal_windows = []
for n in range (0, self.num_win):
self.internal_windows.append(St.ScrolledText(self.win_frame, width=self.win_width))
self.internal_windows[n].grid(column=n*2, row=0, sticky="NSEW", pady=5, padx=5)
for x in range(1, 100):
self.internal_windows[n].insert(tk.END, "{}\n".format(x))
main = Main()
main.mainloop()
答案 0 :(得分:0)
布莱恩·奥克利问你一个非常实际的问题。尽管如此,我已根据我的有限理解修改了您的脚本(见下文),您试图使用文本小部件滚动一个框架,该框架由7个并排放置的Scrolltext小部件组成,并触摸窗口标题栏。您似乎也希望框架覆盖self.text_box
并且text_box具有定义的大小。
对您的脚本进行了主要修改:
.propagate(0)
更改为.grid_propagate(0)
。self.win_width * self.num_win
,因为`self.win_width指的是42个字符宽,未正确用于定义帧宽。您看到self.internal_windows
中的小部件被粉红色包围,这一事实证明这些小部件是self.win_frame
内的网格。
我已将您的脚本还原为使用self.winfo_screenheight()
而不是self.winfo_screenheight() -72
。
旁注:为了滚动目的,我了解到人们通常会使用“tk.Canvas”。以及Scrollbar
来创建Scrollable Frame
。我最近为Vertical Scroll Frame编写了一个脚本,你可能会考虑修改它来进行水平滚动。
修改后的脚本:
import tkinter as tk
from tkinter import ttk
import tkinter.scrolledtext as St
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.num_win = 7
self.win_width = 40
self.style = ttk.Style()
self.style.configure('frame.TFrame', background='pink', borderwidth=5,
relief='raised')
#Set up the root window Note the -72 hack to get it to fit
self.screen_height = self.winfo_screenheight()
#self.screen_height = self.winfo_screenheight() - 72
self.screen_width = self.winfo_screenwidth()
self.geometry("{}x{}+-10+-0".format(self.screen_width, self.screen_height))
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
print('self.screen_height = ', self.screen_height)
print('self.screen_width = ', self.screen_width)
#Set up the mother Text widget that will hold the smaller ones
self.hbar = ttk.Scrollbar(self, orient="horizontal")
self.hbar.grid(column=0, row=2, sticky="EW")
self.text_box = tk.Text(self, xscrollcommand=self.hbar.set, wrap=tk.NONE)
self.text_box.grid(column=0, row=0, padx=(5, 5), sticky="NESW")
self.hbar.config(command=self.text_box.xview)
self.text_box.grid_propagate(0)
#Set up the Frame to grid the internal widgets to.
width = self.win_width * self.num_win
print('width = ', width)
self.win_frame = ttk.Frame(self.text_box, style='frame.TFrame',
width = 310*self.num_win,
#height = self.screen_height,
)
self.text_box.window_create(tk.END, window = self.win_frame)
#Set up the internal text widgets
self.internal_windows = []
for n in range (0, self.num_win):
self.internal_windows.append(St.ScrolledText(self.win_frame,
width=self.win_width))
self.internal_windows[n].grid(column=n, row=0, sticky="NSEW",
pady=5, padx=5)
for x in range(1, 100):
self.internal_windows[n].insert(tk.END, "{}\n".format(x))
self.win_frame.configure(height=self.screen_height)
self.win_frame.grid_propagate(0)
main = Main()
main.mainloop()