Python tkinter frame parent widget 排列列

Python tkinter frame parent widget line up columns

我在框架中放置滚动条,在小部件中放置框架。框架上方有一个标签。上面的标签有三列。带有滚动条的框架有三列。我无法让框架中和框架上方的三列对齐。

我看到并使用了以下两个问题来解决这个问题,但卡住了。
Adding a scrollbar to a group of widgets in Tkinter

Tkinter - Add scrollbar for each LabelFrame

如能提供有关排列列的任何帮助,我们将不胜感激。谢谢。

这是没有排列列的小部件的图片: Columns don't line up

这是一个 MWE:

import tkinter as tk

class Selections(tk.Frame): 
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

    self.FifthLabelLeft = tk.Label(self,
                     text="""Riding""",
                     justify = tk.CENTER,
                     padx = 10).grid(row=4, column = 0, pady=5)

    self.FifthLabelCenter = tk.Label(self,
                     text="""Winning Candidate""",
                     justify = tk.CENTER,
                     padx = 10).grid(row=4, column = 1, pady=5)

    self.FifthLabelRight = tk.Label(self,
                     text="""Percent of Vote""",
                     justify = tk.CENTER,
                     padx = 10).grid(row=4, column = 2, pady=5)

    mybox = tk.LabelFrame(self, padx=5, pady=4)
    mybox.grid(row=5, column=0, columnspan=3)

    canvas = tk.Canvas(mybox, borderwidth=5, background="#70ff33")
    frame = tk.Frame(canvas, background="#33f4ff")
    vsb = tk.Scrollbar(mybox, orient="vertical", command=canvas.yview)
    canvas.configure(yscrollcommand=vsb.set, width=450, heigh=50)       

    vsb.pack(side="right", fill="y")
    canvas.pack(side="left", fill="both", expand=True)
    canvas.create_window((4,4), window=frame, anchor="nw", tags="frame")

    # be sure that we call OnFrameConfigure on the right canvas
    frame.bind("<Configure>", lambda event: self.OnFrameConfigure(canvas))

    self.fillWindow(frame)

    self.QuitButton = tk.Button(self, 
                                text="QUIT", 
                                command=root.destroy, 
                                padx=25, pady=0)
    self.QuitButton.grid(column = 0, columnspan=3)


def fillWindow(self, frame): 
    PartyWinnersList = [['Some list of places', "Somebody's Name", 0.37448599960838064], 
                        ['A shorter list', 'Three Long Names Here', 0.52167817821240514],
                        ['A much longer, longer entry', 'Short Name', 0.41945832387008858]]
    placement = 2
    for i in PartyWinnersList:
        ShowYear = tk.Label(frame,
                                  text="""%s """ % i[0]
                                  )
        ShowYear.grid(row=placement, column = 0, sticky=tk.S)
        ShowSystem = tk.Label(frame,
                                  text="""%s """ % i[1]
                                  )
        ShowSystem.grid(row=placement, column = 1, sticky=tk.N)
        PercentVotes = i[2]*100
        ShowVotes = tk.Label(frame,
                                  text="""%3.1f""" % PercentVotes
                                  )
        ShowVotes.grid(row=placement, column = 2, sticky=tk.N)
        placement += 1

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

if __name__ == "__main__": 
    root = tk.Tk()
    main = Selections(root)
    main.pack(side="top", fill="both", expand=True)
    root.mainloop()  

两个定义的函数在class里,但我没法让它们排成一行

我通常不会这样解决问题,但您可以通过指定标签宽度来强制对齐。当您动态调整 window 的大小时,问题就会出现——一切都是静态的。但这将解决指定的问题 -- 对齐。

import tkinter as tk

class Selections(tk.Frame): 
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        self.FifthLabelLeft = tk.Label(self,
                     text="""Riding""",
                     justify = tk.CENTER,
                     width=25,padx = 10)
        self.FifthLabelLeft.grid(row=4, column = 0, pady=5)

        self.FifthLabelCenter = tk.Label(self,
                     text="""Winning Candidate""",
                     justify = tk.CENTER,
                     width=25,
                     padx = 10).grid(row=4, column = 1, pady=5)

        self.FifthLabelRight = tk.Label(self,
                     text="""Percent of Vote""",
                     justify = tk.CENTER,
                     padx = 10).grid(row=4, column = 2, pady=5)

        mybox = tk.LabelFrame(self, padx=5, pady=4)
        mybox.grid(row=5, column=0, columnspan=3)

        canvas = tk.Canvas(mybox, borderwidth=5, background="#70ff33")
        frame = tk.Frame(canvas, background="#33f4ff")
#        frame.grid_columnconfigure((0,1,2), weight=3)
        vsb = tk.Scrollbar(mybox, orient="vertical", command=canvas.yview)
        canvas.configure(yscrollcommand=vsb.set, width=450, heigh=50)       

        vsb.pack(side="right", fill="y")
        canvas.pack(side="left", fill="both", expand=True)
        canvas.create_window((4,4), window=frame, anchor="nw", tags="frame")

        # be sure that we call OnFrameConfigure on the right canvas
        frame.bind("<Configure>", lambda event: self.OnFrameConfigure(canvas))

        self.fillWindow(frame)

        self.QuitButton = tk.Button(self, 
                                    text="QUIT", 
                                    command=root.destroy, 
                                    padx=25, pady=0)
        self.QuitButton.grid(column = 0, columnspan=3)


    def fillWindow(self, frame): 
        PartyWinnersList = [['Some list of places', "Somebody's Name", 0.37448599960838064], 
                            ['A shorter list', 'Three Long Names Here', 0.52167817821240514],
                            ['A much longer, longer entry', 'Short Name', 0.41945832387008858]]
        placement = 2
        for i in PartyWinnersList:
            ShowYear = tk.Label(frame, text="""%s """ % i[0], width=25)
            ShowYear.grid(row=placement, column = 0, sticky=tk.S)
            ShowSystem = tk.Label(frame,
                                      text="""%s """ % i[1],
                                      width=25
                                      )
            ShowSystem.grid(row=placement, column = 1, sticky=tk.N)
            PercentVotes = i[2]*100
            ShowVotes = tk.Label(frame,
                                      text="""%3.1f""" % PercentVotes,
                                      width=15
                                      )
            ShowVotes.grid(row=placement, column = 2, sticky=tk.N)
            placement += 1

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

if __name__ == "__main__": 
    root = tk.Tk()
    main = Selections(root)
    main.pack(side="top", fill="both", expand=True)
    root.mainloop()