2017-11-03 28 views
0

프레임에 스크롤바를 배치하고 위젯에 프레임을 배치합니다. 프레임 위에 레이블이 있습니다. 위의 레이블에는 세 개의 열이 있습니다. 스크롤 막대가있는 프레임에는 세 개의 열이 있습니다. 프레임의 세 열과 프레임 위의 줄을 정렬 할 수 없습니다.파이썬 tkinter 프레임 부모 위젯 라인 업 열

나는 이것을 얻기 위해 다음 두 가지 질문을보고 사용했지만 붙어있었습니다. 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() 

두 정의 함수

클래스에 있지만, 나는 그들을 가져올 수 없습니다 줄을 서라.

답변

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()