Python 如何正确扩展tkinter窗口?

Python 如何正确扩展tkinter窗口?,python,tkinter,window,expand,Python,Tkinter,Window,Expand,我希望随着用户的扩展,整个东西都能扩展,而不需要像listbox这样的小部件,重新塑造。我希望它完全像扩展一个静止图像一样,保持其纵横比。我该怎么做 from tkinter import * import random from random import * import threading selected = 0 contained = {} contained[0] = [] name = {} maxEventItems = 100 i = 0 while i < 1

我希望随着用户的扩展,整个东西都能扩展,而不需要像listbox这样的小部件,重新塑造。我希望它完全像扩展一个静止图像一样,保持其纵横比。我该怎么做

from tkinter import *
import random
from random import *
import threading

selected = 0

contained = {}
contained[0] = []

name = {}

maxEventItems = 100

i = 0
while i < 10 ** 3:
    contained[0].append(i)
    name[i] = 'Event {}'.format(i)

    i += 1

# Beginning of thread part, in the future.
def eventViewerListboxItems():
    i = 0
    while i < len(contained[selected]):
        eventNumber = contained[selected][i]

        eventViewerListbox.insert(END,'{}'.format(name[eventNumber]))

        i += 1

master = Tk()

masterCanvas = Canvas(master)
masterCanvas.grid(row = 0,column = 0,sticky = N + S + E + W)

masterFrame = Frame(masterCanvas)
masterFrame.grid(row = 0,column = 0)

main = Frame(masterFrame)
main.grid(row = 0,column = 0)

topButtons = Frame(main)
topButtons.grid(row = 0, column = 0)

saveButton = Button(topButtons,text = 'Save')
saveButton.grid(row = 0,column = 0,sticky = W)

loadButton = Button(topButtons,text = 'Load')
loadButton.grid(row = 0,column = 1,sticky = W)

createEventButton = Button(topButtons,text = 'Create event')
createEventButton.grid(row = 0,column = 2,sticky = W)

eventViewer = Frame(main)
eventViewer.grid(row = 1, column = 0)

eventViewerListboxScrollbar = Scrollbar(eventViewer)
eventViewerListboxScrollbar.grid(row = 1,column = 1, sticky = W + N + S)

eventViewerListbox = Listbox(eventViewer)
eventViewerListbox.grid(row = 1,column = 0,sticky = W)

eventViewerListbox.config(yscrollcommand = eventViewerListboxScrollbar.set)
eventViewerListboxScrollbar.config(command = eventViewerListbox.yview)

bottomButtons = Frame(main)
bottomButtons.grid(row = 2, column = 0,sticky = E)

simulateButton = Button(bottomButtons,text = 'Simulate')
simulateButton.grid(row = 0,column = 0,sticky = E)

callEventViewerListboxItems = threading.Thread(target = eventViewerListboxItems)
callEventViewerListboxItems.start()

partial_contained = {}
partial_contained[selected] = []
i = 0
while i < maxEventItems and i < len(contained[selected]):
    partial_contained[selected].append(contained[selected][i])
    i += 1

print('I started putting the items from contained[{}] into the listbox in the event viewer.'.format(contained[selected][0]))
print()

print('Below, I will show the first {} items that are in contained:'.format(i,contained[selected]))
print(partial_contained[selected])
print()

master.mainloop()
从tkinter导入*
随机输入
从随机导入*
导入线程
已选择=0
包含={}
包含[0]=[]
名称={}
maxEventItems=100
i=0
而我<10**3:
包含[0]。追加(i)
名称[i]=“事件{}”。格式(i)
i+=1
#螺纹部分的开始,在将来。
def eventViewerListboxItems():
i=0
当i
问题在于您使用的是网格,但没有为任何行或列指定权重。权重确定哪些行和列被赋予额外空间,例如当用户调整窗口大小时。默认情况下,每行和每列的权重为零,这意味着它们不会获得额外的权重

根据经验,您需要为至少一行和一列调用
grid\u rowconfigure
grid\u columnsigure
,并为该行或列赋予正权重。对于使用网格管理其子部件的每个小部件,您都需要这样做

您也没有始终如一地使用
sticky
属性,因此,即使您让列增长和收缩,您的小部件也不会扩展以填充给定的区域

你需要有条理地创建一个复杂的布局。我的建议是重新开始,让
masterCanvas
像你期望的那样增长和收缩。给它一个醒目、独特的封面,这样你就可以看到它(即:如果它与背景颜色相同,就不可能知道它是在变大还是在变小,以填充整个区域)

一旦你得到了
masterCanvas
,在那里它可以正常地增长和收缩,然后转到
masterFrame
,然后是
main
,然后是
eventViewer
,最后是列表框。在每个步骤中,一定要给小部件一个独特的颜色,以便您可以可视化它


您可能还想考虑删除这么多层嵌套的框架。你拥有的越多,让他们一起工作就越困难。然而,如果你采取有条理的方法,多个领域是很容易的,不要试图让六个不同的框架同时工作。让其中一个工作,然后关注它的直系子女。当他们工作时,关注他们的孩子,等等。

我不理解这句话:“没有小部件,比如列表框,就要重塑”。你想扩展什么?列表框?除了列表框之外的所有内容?所有内容,但请注意,当列表框展开时,它会略微改变形状。它不像静止图像。