阻止 tkinter 框架被推离屏幕
Stop tkinter frame from being pushed off screen
我有一个 tk
window 有 3 个框架,左侧像树结构一样工作,带有标签,将使用 .grid()
和 [=13= 添加和删除标签],右侧框架将显示有关这些项目的信息,底部框架将容纳按钮。如果我在左框架 (lframe) 上展开太多项目,它会将底部框架 (bframe) 推到视野之外。我宁愿底部框架在到达 window 的边缘时停止,并且 lframe 的滚动条用于查看 lframe 的项目。
这是我看到的一个简单示例。当您单击该按钮时,将创建更多标签小部件并将 bframe
推出视图。
from tkinter import *
main = Tk()
canvas = Canvas(main)
canvas.grid(row=0, column=0)
canvas.configure(scrollregion=canvas.bbox("all"))
lframe = Frame(canvas)
lframe.grid(row=0, column=1)
sbar = Scrollbar(canvas)
sbar.config(command=canvas.yview)
canvas.config(yscrollcommand=sbar.set)
sbar.grid(row=0, column=0, sticky=NSEW)
rframe = Frame(main)
rframe.grid(row=0, column=1, sticky=N)
bframe = Frame(main)
bframe.grid(row=1, column=1)
cnt = 1
def addmore():
global cnt
test = Label(lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n')
test.grid(row=cnt, column=0)
cnt += 1
lframe.update()
llbl = Label(lframe, text='this \nis \nthe \nLEFT \nframe')
llbl.grid()
rlbl = Label(rframe, text='this is the RIGHT frame')
rlbl.grid()
btn = Button(rframe, text='click me', command=addmore)
btn.grid(row=1, column=0, sticky=N)
blbl = Label(bframe, text='this is the BOTTOM frame', bg="yellow")
blbl.grid(row=0)
main.mainloop()
问题一:
如何阻止 bframe 推出屏幕?我希望它在到达 main
的底部时停止并且 lframe
中的标签开始从 bframe
后面的视图中推出。然后用户将使用滚动条查看 lframe
.
中的其他项目
问题二:
在让 lframe 停止推出屏幕之前,我不知道我的滚动条是否配置正确。如果设置不正确,我需要更改什么?
这里是一个示例,说明如何在主框架中使用权重设置此滚动 canvas。它并不完美,但应该足以提供帮助。
import tkinter as tk
class Example(tk.Frame):
def __init__(self):
tk.Frame.__init__(self)
self.canvas = tk.Canvas(self, borderwidth=0, width = 50, height = 100)
self.lframe = tk.Frame(self.canvas, width=10)
self.sbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.sbar.set)
self.sbar.grid(row=0, column=0, rowspan=2, sticky="nsw")
self.canvas.grid(row=0, column=1, rowspan=2, sticky="nsew")
self.canvas.create_window((2,2), window=self.lframe, anchor="ne",
tags="self.lframe")
self.lframe.bind("<Configure>", self.onFrameConfigure)
self.rframe = tk.Frame(self)
self.rframe.grid(row=0, column=2, sticky="n")
self.bframe = tk.Frame(self)
self.bframe.grid(row=1, column=2)
llbl = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe')
llbl.grid(row = 0, column = 0)
rlbl = tk.Label(self.rframe, text='this is the RIGHT frame')
rlbl.grid(row = 0, column = 0)
btn = tk.Button(self.rframe, text='click me', command=self.addmore)
btn.grid(row=1, column=0, sticky="n")
blbl = tk.Label(self.bframe, text='this is the BOTTOM frame', bg="yellow")
blbl.grid(row = 2, column = 0, sticky = "s")
self.bframe.rowconfigure(1, weight = 1)
self.bframe.rowconfigure(2, weight = 0)
self.rowconfigure(0, weight = 1)
self.rowconfigure(1, weight = 1)
self.columnconfigure(0, weight = 0)
self.columnconfigure(1, weight = 1)
self.columnconfigure(2, weight = 0)
self.cnt = 1
def addmore(self):
test = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n')
test.grid(row=self.cnt, column=0)
self.cnt += 1
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example().grid(row=0, column=0)
root.mainloop()
我有一个 tk
window 有 3 个框架,左侧像树结构一样工作,带有标签,将使用 .grid()
和 [=13= 添加和删除标签],右侧框架将显示有关这些项目的信息,底部框架将容纳按钮。如果我在左框架 (lframe) 上展开太多项目,它会将底部框架 (bframe) 推到视野之外。我宁愿底部框架在到达 window 的边缘时停止,并且 lframe 的滚动条用于查看 lframe 的项目。
这是我看到的一个简单示例。当您单击该按钮时,将创建更多标签小部件并将 bframe
推出视图。
from tkinter import *
main = Tk()
canvas = Canvas(main)
canvas.grid(row=0, column=0)
canvas.configure(scrollregion=canvas.bbox("all"))
lframe = Frame(canvas)
lframe.grid(row=0, column=1)
sbar = Scrollbar(canvas)
sbar.config(command=canvas.yview)
canvas.config(yscrollcommand=sbar.set)
sbar.grid(row=0, column=0, sticky=NSEW)
rframe = Frame(main)
rframe.grid(row=0, column=1, sticky=N)
bframe = Frame(main)
bframe.grid(row=1, column=1)
cnt = 1
def addmore():
global cnt
test = Label(lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n')
test.grid(row=cnt, column=0)
cnt += 1
lframe.update()
llbl = Label(lframe, text='this \nis \nthe \nLEFT \nframe')
llbl.grid()
rlbl = Label(rframe, text='this is the RIGHT frame')
rlbl.grid()
btn = Button(rframe, text='click me', command=addmore)
btn.grid(row=1, column=0, sticky=N)
blbl = Label(bframe, text='this is the BOTTOM frame', bg="yellow")
blbl.grid(row=0)
main.mainloop()
问题一:
如何阻止 bframe 推出屏幕?我希望它在到达 main
的底部时停止并且 lframe
中的标签开始从 bframe
后面的视图中推出。然后用户将使用滚动条查看 lframe
.
问题二: 在让 lframe 停止推出屏幕之前,我不知道我的滚动条是否配置正确。如果设置不正确,我需要更改什么?
这里是一个示例,说明如何在主框架中使用权重设置此滚动 canvas。它并不完美,但应该足以提供帮助。
import tkinter as tk
class Example(tk.Frame):
def __init__(self):
tk.Frame.__init__(self)
self.canvas = tk.Canvas(self, borderwidth=0, width = 50, height = 100)
self.lframe = tk.Frame(self.canvas, width=10)
self.sbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.sbar.set)
self.sbar.grid(row=0, column=0, rowspan=2, sticky="nsw")
self.canvas.grid(row=0, column=1, rowspan=2, sticky="nsew")
self.canvas.create_window((2,2), window=self.lframe, anchor="ne",
tags="self.lframe")
self.lframe.bind("<Configure>", self.onFrameConfigure)
self.rframe = tk.Frame(self)
self.rframe.grid(row=0, column=2, sticky="n")
self.bframe = tk.Frame(self)
self.bframe.grid(row=1, column=2)
llbl = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe')
llbl.grid(row = 0, column = 0)
rlbl = tk.Label(self.rframe, text='this is the RIGHT frame')
rlbl.grid(row = 0, column = 0)
btn = tk.Button(self.rframe, text='click me', command=self.addmore)
btn.grid(row=1, column=0, sticky="n")
blbl = tk.Label(self.bframe, text='this is the BOTTOM frame', bg="yellow")
blbl.grid(row = 2, column = 0, sticky = "s")
self.bframe.rowconfigure(1, weight = 1)
self.bframe.rowconfigure(2, weight = 0)
self.rowconfigure(0, weight = 1)
self.rowconfigure(1, weight = 1)
self.columnconfigure(0, weight = 0)
self.columnconfigure(1, weight = 1)
self.columnconfigure(2, weight = 0)
self.cnt = 1
def addmore(self):
test = tk.Label(self.lframe, text='this \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\nthis \nis \nthe \nLEFT \nframe\n')
test.grid(row=self.cnt, column=0)
self.cnt += 1
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example().grid(row=0, column=0)
root.mainloop()