【问题标题】:How do I expand my tkinter window properly?如何正确扩展我的 tkinter 窗口?
【发布时间】:2016-03-21 18:23:20
【问题描述】:

我希望整个事物随着用户的展开而展开,而无需像列表框这样的小部件进行重塑。我希望它就像扩展保持其纵横比的静止图像一样。我该怎么做?

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()

【问题讨论】:

  • 我不明白这句话:“没有小部件,如列表框,重塑”。你想扩展什么?列表框?除了列表框之外的所有内容?
  • 一切,但请注意,当列表框展开时,它会略微重塑。它不像静止图像。

标签: python tkinter window expand


【解决方案1】:

问题是您使用的是网格,但您没有为任何行或列赋予权重。权重决定了哪些行和列被赋予了额外的空间,例如当用户调整窗口大小时。默认情况下,每行和每列的权重为零,这意味着它们没有额外的权重。

根据经验,您需要为至少一行和一列调用grid_rowconfiguregrid_columnconfigure,并为该行或列赋予正权重。您需要对每个使用网格来管理其子级的小部件执行此操作。

您也没有始终如一地使用sticky 属性,因此即使您让列增大和缩小,您的小部件也不会扩展以填充它们被赋予的区域。

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

一旦你得到masterCanvas,它正在适当地增长和缩小,移动到masterFrame,然后是main,然后是eventViewer,最后是列表框。在每个步骤中,请确保为小部件提供独特的颜色,以便您可以将其可视化。

您可能还需要考虑移除如此多的嵌套框架层。你拥有的越多,让他们一起工作就越困难。然而,如果你采取有条不紊的方法,多个领域是容易的,不要试图同时让六个不同的框架一起工作。让一个工作,然后专注于它的直接孩子。当他们工作时,专注于他们的孩子,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多