Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tkinter中对齐嵌套网格布局中的条目_Python_Python 3.x_Tkinter_Grid Layout - Fatal编程技术网

Python 在tkinter中对齐嵌套网格布局中的条目

Python 在tkinter中对齐嵌套网格布局中的条目,python,python-3.x,tkinter,grid-layout,Python,Python 3.x,Tkinter,Grid Layout,我有以下代码: from tkinter import * class GUI(Tk): def __init__(self, *args, **kw): super().__init__(*args, **kw) self.frame = Frame(self) self.frame.pack(fill=BOTH, expand=YES) row = 0 self.source_lbl = Label(self.frame, text="So

我有以下代码:

from tkinter import *


class GUI(Tk):
  def __init__(self, *args, **kw):
    super().__init__(*args, **kw)

    self.frame = Frame(self)
    self.frame.pack(fill=BOTH, expand=YES)

    row = 0
    self.source_lbl = Label(self.frame, text="Source:")
    self.source_lbl.grid(column=0, row=row, sticky='w')
    self.source_txt = Entry(self.frame, width=60)
    self.source_txt.grid(column=1, row=row)
    self.source_btn = Button(self.frame, text="Browse")
    self.source_btn.grid(column=2, row=row)

    row += 1
    self.extra_frame = ExtraFrame(self.frame)
    self.extra_frame.grid(row=row, columnspan=3, sticky='w')


class ExtraFrame(Frame):
  def __init__(self, *args, **kw):
    super().__init__(*args, **kw)
    self.pairs = []

    self.key_lbl = Label(self, text="Key", anchor='w')
    self.value_lbl = Label(self, text="Value", anchor='w')

    self.add_btn = Button(self, text="+", command=self.add_pair)
    self.add_btn.grid()

  def add_pair(self):
    pair_frame = KWFrame(self, pady=2)
    self.pairs.append(pair_frame)
    pair_frame.grid(row=len(self.pairs), columnspan=3)
    self.update_labels_and_button()

  def update_labels_and_button(self):
    if self.pairs:
      self.key_lbl.grid(column=0, row=0, sticky='w')
      self.value_lbl.grid(column=1, row=0, sticky='w')
    else:
      self.key_lbl.grid_remove()
      self.value_lbl.grid_remove()
    self.add_btn.grid(row=len(self.pairs) + 1)


class KWFrame(Frame):
  def __init__(self, *args, **kw):
    super().__init__(*args, **kw)

    self.key_txt = Entry(self, width=30)
    self.key_txt.grid(column=0, row=0)

    self.value_txt = Entry(self, width=30)
    self.value_txt.grid(column=1, row=0)

    self.remove_btn = Button(self, text="-", command=self.remove)
    self.remove_btn.grid(column=2, row=0)

  def remove(self):
    i = self.master.pairs.index(self)
    del self.master.pairs[i]
    for pair in self.master.pairs[i:]:
      pair.grid(row=pair.grid_info()['row'] - 1)
    self.master.update_labels_and_button()
    self.destroy()

gui = GUI()
gui.mainloop()

这与能够添加/删除新的文本输入行很好地配合,但只有一个问题:标签“Key”和“Value”与这些行中各自的输入字段不对齐(尽管列值正确)。有没有一种简单的方法可以使用这种嵌套的网格布局将它们很好地对齐?

标签(…,宽度=30)
-虽然不理想,但效果很好。虽然不是最干净的,但我还是要它。添加
self.grid\u columnconfigure(0,weight=1);self.grid\u column配置(1,权重=1)
class-ExtraFrame
class-KWFrame
并使用
sticky='ew'