在单独的框架上对齐Tkinter网格

时间:2018-10-03 00:01:58

标签: python tkinter

我正在尝试执行与此处用户类似的操作:Aligning widgets using grid between multiple Tkinter LabelFrames

我想将以红色和蓝色突出显示的标签窗口小部件与其下方框架中的文本窗口小部件网格对齐。即使我将每个小部件的宽度指定为相同的字符数,并且对标签和文本框使用相同的tkFont,也无法使它们的像素宽度相同。我听说您可以使用grid_columnconfigure来执行此操作,但是我看不到唯一的参数是 minsize pad weight 。我也尝试过使用pack_propagate,但无所适从使其无所不能。有什么方法可以对齐网格在不同框架中的列或指定标签窗口小部件的确切宽度(以像素为单位)?

enter image description here

我以前编写代码的方式是,标签与文本框在同一框架中的同一网格中,这可以避免此问题,但可以解决此问题,从而使向下滚动时标签不可见。无论您要查看网格的哪个部分,我都希望标签可见,但是我希望它们仍与网格相对应,以提高可读性。

class Window(Frame):

def __init__(self, master=None):
    Frame.__init__(self, master)
    self.master = master
    self.currRow = -1
    self.currCol = -1
    self.width = 1100
    self.height = 200

    self.topWin = Frame(root)
    self.topWin.pack(side=TOP)

    self.baseWin = Frame(root)
    self.baseWin.pack()

    self.headerWin = Frame(self.baseWin)
    self.headerWin.pack(side=TOP)

    self.leftWin = Frame(self.baseWin)
    self.leftWin.pack(side=LEFT)

    self.canvas = Canvas(self.leftWin, width=1050, height=200)
    self.bottomWin = Frame(self.canvas)

    self.canvas.pack(fill="both", expand=True)
    self.canvas.create_window(self.width/2, 50, window=self.bottomWin)

    self.scrollbar = Scrollbar(self.baseWin, orient="vertical", command=self.canvas.yview)
    self.scrollbar.pack(side="right", fill="y")

    self.canvas.configure(yscrollcommand=self.scrollbar.set)
    self.bottomWin.bind("<Configure>", self.onFrameConfigure)


    self.font = tkFont.Font(root=self.bottomWin, family="Helvetica", size=10,
        weight="bold")
    self.headerFont = tkFont.Font(root=self.bottomWin, family="Helvetica",
        size=10, weight="bold")

    self.displayMode = "all"
    self.filterEstimates = False
    self.filterBids = False
    self.filterContact = False
    self.filterRenewal = False

    self.init_window()
    self.loadJobs()

def onFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

def printColumnHeaders(self):
    j = 0 
    bg = "blue"
    for header in self.headers:
        if j % 2 == 0:
            bg = "blue"
        else:
            bg = "red"
        label = Label(self.headerWin, text=header, font=self.headerFont, width=12, anchor="w", bg=bg)
        label.grid(row=0, column=j, sticky="WE")
        if j == 0:
            label.grid_columnconfigure(j, minsize=50)
        j = j + 1

1 个答案:

答案 0 :(得分:2)

我以前通过making a multicolumn listbox解决了这个问题。复制该代码并运行它;第二个例子正是您想要的。

相关问题