简体   繁体   English

Python TKinter:调整窗口大小时,框架和画布将水平扩展,但不会垂直扩展

[英]Python TKinter: frame and canvas will expand horizontally, but not vertically, when window is resized

For some reason, I was able to get this TKinter frame ( allValOuterFrame ) to expand both vertically and horizontally when its window is resized, but however, it appears that the canvas that the frame holds, as well as the frame and vertical scrollbar inside that canvas, will only expand horizontally. 出于某种原因,我能够使此TKinter框架( allValOuterFrame )在调整其窗口大小时在垂直和水平方向上展开,但是,看起来该框架所容纳的画布以及其中的框架和垂直滚动条画布,只会水平扩展。 Could someone please explain why? 有人可以解释为什么吗?

Here is my code: 这是我的代码:

# At first I only had "from X import *" but then discovered that
# it is bad practice, so I also included "import X" statements so
# that if I need to use something from tk or ttk explicitly, I can,
# but I had 2/3 of my code done at that point so I had to leave in the
# "import *" things.
try:
    from Tkinter import * #python 2
    import Tkinter as tk
    from ttk import *
    import ttk
    import tkMessageBox as msg
    import tkFileDialog as openfile
except ImportError:
    from tkinter import * #python 3
    import tkinter as tk
    from tkinter.ttk import *
    import tkinter.ttk as ttk
    from tkinter import messagebox as msg
    from tkinter import filedialog as openfile
import csv
# My stuff:
from extractor import Analysis
from extractor import createDictionariesAndLists as getRawData
from nitrogenCorrector import correct as nCorrect
from carbonCorrector import correct as cCorrect


( ... )


def createAllValWindow(self):

    allValWindow = Toplevel(self)
    allValWindow.grab_set()

    if self.element == "N":
        allValWindow.title("All Nitrogen Raw Data Values")
    elif self.element == "C":
        allValWindow.title("All Carbon Raw Data Values")
    else:
        allValWindow.title("All Raw Data Values")

    allValOuterFrame = tk.Frame(allValWindow,background="#00FF00")
    allValCanvas = Canvas(allValOuterFrame, borderwidth=0)
    allValInnerFrame = Frame(allValCanvas, borderwidth=5)

    def allValOnFrameConfigure(event):
        allValCanvas.configure(scrollregion=allValCanvas.bbox("all"))

    allValOuterFrame.grid_rowconfigure(0,weight=1)
    allValOuterFrame.grid_columnconfigure(0,weight=1)
    allValInnerFrame.grid_rowconfigure(0,weight=1)
    allValInnerFrame.grid_columnconfigure(0,weight=1)

    allValVertScrollbar = Scrollbar(allValOuterFrame, orient="vertical",command=allValCanvas.yview)
    allValHorizScrollbar = Scrollbar(allValOuterFrame, orient="horizontal",command=allValCanvas.xview)
    allValCanvas.configure(yscrollcommand=allValVertScrollbar.set, xscrollcommand=allValHorizScrollbar.set)
    allValVertScrollbar.grid(row=1,column=12,sticky=N+S)
    allValHorizScrollbar.grid(row=2,column=0,columnspan=12,sticky=E+W)

    allValCanvas.grid(row=1,column=0,columnspan=12,sticky=N+S+E+W)        allValCanvas.create_window((4,4),window=allValInnerFrame,anchor="nw",tags="allValInnerFrame")
    allValInnerFrame.bind("<Configure>",allValOnFrameConfigure)
    allValDoneButton = Button(allValWindow,text="Done",command=allValWindow.destroy)
    allValOuterFrame.pack(fill="both",expand=1)
    allValDoneButton.pack()

    textRows = [self.rawHeader]
    textLabels = [[]]
    numDiffAminos = len(self.analyses) - 1 # Ignore the "trash" list at the end
    for singleAminoAnalyses in self.analyses[0:numDiffAminos]: # Once again, ignoring the last list
        if len(singleAminoAnalyses) < 1:
            continue
        for analysis in singleAminoAnalyses:
            textRows.append([str(analysis.analysisID),
                             str(analysis.row),
                             str(analysis.identifier1),
                             str(analysis.identifier2),
                             str(analysis.comment),
                             str(analysis.peakNumber),
                             str(analysis.rt),
                             str(analysis.component),
                             str(analysis.areaAll),
                             str(analysis.ampl), 
                             str(analysis.r), 
                             str(analysis.delta)])
            textLabels.append([])
    for i in range(len(textRows)):
        if i == 0:
            listRow = i
        else:
            listRow = i+1
        for j in range(len(textRows[i])):
            if i == 0:
                textLabels[i].append(Label(allValInnerFrame,text=textRows[i][j],font=("Fixedsys",10,"bold")))
            else:
                textLabels[i].append(Label(allValInnerFrame,text=textRows[i][j]))
            if j == 9:
                textLabels[i][j].grid(row=listRow,column=j,sticky=W+E,padx=(4,10))
            else:
                textLabels[i][j].grid(row=listRow,column=j,sticky=W+E,padx=(4,4))
        if i == 0:
            separator = tk.Frame(allValInnerFrame, height=2, borderwidth=1, bg="black", relief=SUNKEN)
            separator.grid(row=1,column=0,columnspan=12,sticky=W+E)

这是因为您将AllValOuterFrame的第0行的权重设置为1,但是将画布放置在第1行中。如果将画布移动到第0行或将行1的权重设置为1,它将按照您期望的方式调整大小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM