2017-11-03 11 views
0

フレーム内にスクロールバーを配置し、ウィジェット内にフレームを配置します。フレームの上にラベルがあります。上記のラベルには3つの列があります。スクロールバーを持つフレームには3つの列があります。私はフレームの3列とフレームの上に整列することができません。Pythonのtkinterフレームの親ウィジェットの列の列

これまでのところ、次の2つの質問を見て、使用しましたが、固まってしまいました。
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() 

定義された2つの関数がクラスにいるが、私は彼らがに得ることができませんでした並ぶ。

答えて

0

私は通常このように問題を解決しませんが、ラベルの幅を指定することでアラインメントを強制することができます。この問題は、動的にウィンドウのサイズを変更するときに発生します。すべてが静的です。しかし、これは指定された問題を解決します。

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() 
関連する問題