【问题标题】:I'm having issues converting python .pack() to .grid()我在将 python .pack() 转换为 .grid() 时遇到问题
【发布时间】:2020-11-19 19:43:49
【问题描述】:

下面的代码有问题。我在一个讲师完成的 udemy 课程上看到了这段代码,他使用.pack() 方法在 tkinter 窗口中定义了小分区。

问题是我需要在后面使用.grid(),由于这两种方法不能在同一个程序中使用,我需要将.pack()转换为.grid(),但我没有想法如何做到这一点。怎么做?

from tkinter import *
import time
from tkinter import ttk

#~~~~~~~~~~~~~~Defining the window~~~~~~~~~~~~~

root=Tk()
root.title("Parent window")
root.geometry('1600x800+0+0')
root.configure(bg='#FFFFFF')
#~~~~~~~~~~~~~~window~partition~~~~~~~~~~~~~~~~

top=Frame(root, width=1600, height=100, bg='blue', relief=SUNKEN)
top.pack(side=TOP)  #i need to change this .pack() to something else to make the program compatible with .grid() for all the lines

w1=Frame(root, width=800, height=700, bg='purple', relief=SUNKEN)
w1.pack(side=LEFT)

w2=Frame(root, width=300, height=700, bg='green', relief=SUNKEN)
w2.pack(side=RIGHT)

w3=Frame(root, width=35, height=700, bg='orange', relief=SUNKEN)
w3.pack(side=LEFT)

w4=Frame(root, width=100, height=700, bg='pink', relief=SUNKEN)
w4.pack(side=LEFT)
root.mainloop()

【问题讨论】:

  • " 因为这两种方法不能在同一个程序中使用" - 这不是一个真实的陈述。它们可以在同一个程序中使用,但它们不能同时用于具有相同主控的小部件。
  • 啊,是的,感谢您指出这一点,对不起,我是 python 编码的新手。

标签: python tkinter


【解决方案1】:

您可以在同一个 tkinter 程序中同时使用 packgrid。只要您不混合具有相同父小部件的方法即可。

您可以在下面看到一个混合了packgrid 的程序示例:

from tkinter import *
import time
from tkinter import ttk

#~~~~~~~~~~~~~~Defining the window~~~~~~~~~~~~~

root=Tk()
root.title("Parent window")
root.geometry('1600x800+0+0')
root.configure(bg='#FFFFFF')
#~~~~~~~~~~~~~~window~partition~~~~~~~~~~~~~~~~

top=Frame(root, width=1600, height=100, bg='blue', relief=SUNKEN)
top.pack(side=TOP) 

# Here I create a new parent frame, to contain the widgets we wish to 
# use .grid() for instead of .pack()
gridframe = Frame(root, width=1600, height=700)
gridframe.pack(side=TOP)

w1=Frame(gridframe, width=800, height=700, bg='purple', relief=SUNKEN)
w1.grid(row=0, column=0)

w2=Frame(gridframe, width=300, height=700, bg='green', relief=SUNKEN)
w2.grid(row=0, column=1)

w3=Frame(gridframe, width=35, height=700, bg='orange', relief=SUNKEN)
w3.grid(row=0, column=2)

w4=Frame(gridframe, width=100, height=700, bg='pink', relief=SUNKEN)
w4.grid(row=0, column=3)

root.mainloop()

要复制您使用 pack 函数获得的结果,请尝试以下操作。我正在使用padx 在小部件之间添加空格,以便它与您在打包时看到的相匹配

w1=Frame(gridframe, width=800, height=700, bg='purple', relief=SUNKEN)
w1.grid(row=0, column=0)

w2=Frame(gridframe, width=35, height=700, bg='orange', relief=SUNKEN)
w2.grid(row=0, column=1)

w3=Frame(gridframe, width=100, height=700, bg='pink', relief=SUNKEN)
w3.grid(row=0, column=2)

w4=Frame(gridframe, width=300, height=700, bg='green', relief=SUNKEN)
w4.grid(row=0, column=3, padx=1600-800-35-100-300)

【讨论】:

  • 非常感谢,但我注意到原始程序中的窗口与您的完全不同,有什么原因吗?我的问题是我已经编写了 250 行代码,现在窗口完全不同了,我的代码无效,因为一切都有些混乱(轻描淡写,哈哈),抱歉给您带来不便。
  • pack 命令将根据您指定的一侧将小部件放置在父框架中,而grid 命令将它们放置在由行和列组成的网格中。要使用网格复制您在上面看到的图片,您首先需要对列重新排序,然后还要添加一个填充空白的列,因为列宽的总和小于父宽度
  • 编辑了我的答案以显示复制结果的示例
  • 非常感谢,帮了大忙!
猜你喜欢
  • 2021-04-05
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2014-02-28
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多