Python 停止tkinter机架被推出屏幕

Python 停止tkinter机架被推出屏幕,python,python-3.x,tkinter,scrollbar,frame,Python,Python 3.x,Tkinter,Scrollbar,Frame,我有一个带有3个框架的tk窗口,左侧的工作方式类似于一个树形结构,标签将通过.grid()和grid\u remove()添加和删除,右侧的框架将显示这些项目的信息,底部的框架将容纳按钮。如果我在左框架(lframe)上展开太多项目,它会将底部框架(bframe)推出视图。我希望底部的框架在到达窗口边缘时停止,并且lframe的滚动条用于查看lframe的项目 这是一个我所看到的简单例子。当您单击按钮时,将创建更多标签小部件,并将bframe推到视图之外 from tkinter import

我有一个带有3个框架的
tk
窗口,左侧的工作方式类似于一个树形结构,标签将通过
.grid()
grid\u remove()
添加和删除,右侧的框架将显示这些项目的信息,底部的框架将容纳按钮。如果我在左框架(lframe)上展开太多项目,它会将底部框架(bframe)推出视图。我希望底部的框架在到达窗口边缘时停止,并且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()
问题1: 如何阻止bframe从屏幕上推出?我希望它在到达
main
底部时停止,
lframe
中的标签开始从
bframe
后面的视图中推出。然后用户将使用滚动条查看
lframe
中的其他项目

问题2:
我不知道我的滚动条是否配置正确,直到我可以让lframe停止推出屏幕。如果设置不正确,我需要更改什么

下面是一个示例,说明如何在主框架中设置带权重的滚动画布。这并不完美,但应该足够有帮助

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()
将tkinter作为tk导入
类示例(tk.Frame):
定义初始化(自):
tk.Frame.\uuuu init\uuuuu(自)
self.canvas=tk.canvas(self,borderwidth=0,width=50,height=100)
self.lframe=tk.Frame(self.canvas,宽度=10)
self.sbar=tk.Scrollbar(self,orient=“vertical”,command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.sbar.set)
self.sbar.grid(行=0,列=0,行span=2,sticky=“nsw”)
self.canvas.grid(行=0,列=1,行span=2,sticky=“nsew”)
self.canvas.create_window((2,2),window=self.lframe,anchor=“ne”,
tags=“self.lframe”)
self.lframe.bind(“,self.onFrameConfigure)
self.rframe=tk.Frame(self)
self.rframe.grid(行=0,列=2,sticky=“n”)
self.bframe=tk.Frame(self)
self.bframe.grid(行=1,列=2)
llbl=tk.Label(self.lframe,text='this\nis\n\nLEFT\nframe')
llbl.grid(行=0,列=0)
rlbl=tk.Label(self.rframe,text='this is the RIGHT frame')
rlbl.grid(行=0,列=0)
btn=tk.Button(self.rframe,text='click me',command=self.addmore)
btn.网格(行=1,列=0,sticky=“n”)
blbl=tk.Label(self.bframe,text='这是底部框架',bg=“黄色”)
blbl.grid(行=2,列=0,sticky=“s”)
self.bframe.rowconfigure(1,权重=1)
self.bframe.rowconfigure(2,权重=0)
self.rowconfigure(0,权重=1)
self.rowconfigure(1,权重=1)
self.columnconfigure(0,权重=0)
self.columnconfigure(1,权重=1)
self.columnconfigure(2,权重=0)
self.cnt=1
def addmore(自我):
test=tk.Label(self.lframe,text='this\n\nLEFT\n帧\n这个\n\n这个\n\nReft\n框架\n这是\nReft\n框架\n\n这个\nReft\n')
test.grid(行=self.cnt,列=0)
self.cnt+=1
def onFrameConfigure(自我,事件):
''重置滚动区域以包含内部框架''
self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例().grid(行=0,列=0)
root.mainloop()

解决调整大小问题的方法可能是在此处使用列和行权重。使用
rowconfigure()
columnconfigure()
。我已经修复了我端的大小调整,但由于某些原因,我无法让滚动条工作。“我会一直搞砸它,直到我弄明白为什么会这样。”SierraMountainTech根据文档,重量只是控制它增长的速度。将它添加到上面的示例中并没有改变任何东西。它确实改变了任何东西。但是,如果在主窗口中为底部框架添加一个零权重表示最后一行,然后为顶部框架添加一个1的权重,那么底部框架将永远不会被推出。我将在解决所有错误后提供一个示例。仍在试图弄清楚为什么滚动条不能正常工作这几乎就是我想要的。滚动条可以工作,但lframe不允许扩展。这迫使我为lframe设置一个静态大小,这可能无法在所有监视器上工作。我会玩一会儿,看看是否能让它工作。@sidnical:你需要自动展开然后在特定点停止吗?您可以设置框架的最大大小。类中的行和列配置似乎没有什么区别。我删除了init末尾的配置部分,它似乎没有改变UI的工作方式。当您单击按钮添加更多标签时,此示例是否会扩展lframe?@sidnical Iframe会扩展,画布会调整大小,但画布所在的框架不会调整大小,除非您调整窗口的大小。奇怪的是,直接复制和粘贴对我来说不起同样的作用。一、 我正在使用python 3.5.2。你用的是什么版本?