【问题标题】:splitting windows using frames in tkinter and python在 tkinter 和 python 中使用框架分割窗口
【发布时间】:2020-04-17 14:27:37
【问题描述】:

我正在尝试学习 tkinter 以及如何使用网格和框架来组织 GUI。我已经创建了简单的滚动条列表框,但想将它们都放在屏幕右侧的一个框架中,以便左侧可以用于另一框架。有人可以帮我指导如何将显示分成 2 帧吗?

from tkinter import *
from tkinter import ttk

my_window = Tk()
# frame_name = Frame(my_window)

my_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11',
           '12', '13', '14', '15', '16', '17', '18', '19', '20']
my_list2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11',
            '12', '13', '14', '15', '16', '17', '18', '19', '20']


listbox_object = Listbox(my_window)
listbox_object2 = Listbox(my_window)
# listbox.pack()
listbox_object.grid(row=0, column=1)
listbox_object2.grid(row=0, column=3)

scrollbar_object = Scrollbar(my_window)
scrollbar_object2 = Scrollbar(my_window)
# scrollbar.pack(side=RIGHT, fill=Y)
scrollbar_object.grid(row=0, column=2, sticky='ns')
scrollbar_object2.grid(row=0, column=4, sticky='ns')

for item in my_list:
    listbox_object.insert(END, item)

for item in my_list2:
    listbox_object2.insert(END, item)

# attach listbox to scrollbar
listbox_object.config(yscrollcommand=scrollbar_object.set)
listbox_object2.config(yscrollcommand=scrollbar_object2.set)
scrollbar_object.config(command=listbox_object.yview)
scrollbar_object2.config(command=listbox_object2.yview)
mainloop()

【问题讨论】:

标签: python tkinter frames tkinter-layout


【解决方案1】:

目前还不是很清楚你想用框架做什么。 但是,我可以告诉您,GUI 中的元素是分层的。所以如果你想分成两帧,你可以这样做:

main_frame = Frame(my_window)
main_frame.grid(row=0, column=0, sticky="nswe")

left_frame = Frame(main_frame)
left_frame.grid(row=0, column=0, sticky="nswe")

# Button added just to see that there is a left frame, otherwise it will shrink
button_object = Button(left_frame, text="My Button")
button_object.grid(row=0, column=0)

right_frame = Frame(main_frame)
right_frame.grid(row=0, column=1, sticky="nswe")

listbox_object = Listbox(right_frame)
listbox_object2 = Listbox(right_frame)
listbox_object.grid(row=0, column=0)
listbox_object2.grid(row=0, column=2)

scrollbar_object = Scrollbar(right_frame)
scrollbar_object2 = Scrollbar(right_frame)
scrollbar_object.grid(row=0, column=1, sticky='ns')
scrollbar_object2.grid(row=0, column=3, sticky='ns')

请注意,我添加了一个全局 main_frame 来封装所有内容,因为这比直接使用 Tk 根更好。

最后,如果你想更紧密地设计你的界面,你需要使用columnconfigurerowconfigure来控制你的界面如何分割未使用的空间,例如

main_frame.columnconfigure(0, weight=3)
main_frame.columnconfigure(1, weight=1)

告诉您的界面剩余的水平空间的 3/4 属于 left_frame(main_frame 的第 0 列)和 1/4 属于 right_frame(main_frame 的第 1 列)

对于 GUI 设计,很多事情通常都不是很直观。在您的情况下,我建议在调试时使用bg 参数:

main_frame = Frame(my_window, bg="BLUE")
left_frame = Frame(main_frame, bg="RED")
right_frame = Frame(main_frame, bg="GREEN")

以便您在调整窗口大小时清楚地看到程序如何分割空间。

【讨论】:

  • 所以 main_frame 在 row=0,column=0 处包含 left_frame 和 right_frame?并且左右框架内的 col 和 row 位置只是相对于它们自身 - 如果我理解正确,我认为这是让我感到困惑的一点 - 谢谢
  • 好吧left_frame.grid(row=0, column=0,...) 表示left_frame 在其父级(main_frame)内位于row=0 和column=0。与right_frame.grid(row=0, column=1,...) 类似,它位于 column=1。相反,main_frame.columnconfigure(0, ...) 适用于 column=0 的所有 ITS CHILDREN(在这种情况下,仅 left_frame)。
猜你喜欢
  • 2021-08-29
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多