2016-07-25 4 views
0

Mein Code verwendet einen vertikalen gescrollten Rahmen (von here). Momentan sind "Name: Ryan" und das Eingabefeld nicht in derselben Zeile ausgerichtet. Ich wollte das Eingabefeld und das Etikett so ausrichten, dass sie sich in derselben Spalte befinden, und ich habe mich mit der Methode pack() herumgeschlagen, aber ich konnte sie nicht beheben.Wie werden Eintrag und Label in derselben Zeile innerhalb eines scrollbaren Rahmens ausgerichtet?

if __name__ == "__main__": 

    class SampleApp(Tk): 
     def __init__(self, *args, **kwargs): 

      root = Tk.__init__(self, *args, **kwargs) 
      self.label = Label(text="Choose the info to exclude (if any) on the \n left." 
            "Write the number of the tags that should \n be associated with the information on the right.") 
      self.label.pack() 

      self.frame = VerticalScrolledFrame(root) 
      self.frame.pack(side=LEFT) 


      self.frame2=VerticalScrolledFrame(root) 
      self.frame2.pack() 

      buttons = [] 
      resource=[] 
      for i in range(10): 
       buttons.append(Checkbutton(self.frame.interior, text=str(i)+". "+ "Button")) 
       buttons[-1].pack() 

      label=[] 
      for i in range(10): 
       resource.append(Entry(self.frame2.interior, width=3)) 
       label.append(Label(self.frame2.interior,text="Name: Ryan")) 
       label[-1].pack() 
       resource[-1].pack() 


    app = SampleApp() 
    app.mainloop() 

Output:

Output:

+0

@BryanOakley Ja, sorry für die Verwirrung. – Neil

Antwort

2

Wenn Sie wollen die Dinge in einem Raster-Layout, die beste Wahl ist grid statt pack zu verwenden.

Zum Beispiel:

self.frame2.interior.grid_columnconfigure(1, weight=1) 
for i in range(10): 
    resource.append(Entry(self.frame2.interior, width=3)) 
    label.append(Label(self.frame2.interior,text="Name: Ryan")) 
    label[-1].grid(row=i, column=0, sticky="e") 
    resource[-1].grid(row=i, column=1, sticky="ew") 
+0

Sein VerticalScrolledFrame ruft '.pack()' intern auf. Bedeutet das nicht, dass er '.grid()' und '.pack()' im selben Fenster mischt? Ist das nicht eine schlechte Sache? –

+0

@ Robᵩ: Nein, weil es 'pack' für Widgets _inside_ des inneren Rahmens nicht aufruft. self.frame2.interior ist komplett unter Kontrolle des Aufrufers. –

+0

Danke. In diesem Fall ist '.grid()' offensichtlich eine bessere Wahl. –

1

Versuchen Zwischenrahmen, in denen die Schaffung jede Zeile zu halten, etwa so:

class SampleApp(Tk): 
    def __init__(self, *args, **kwargs): 

     root = Tk.__init__(self, *args, **kwargs) 
     self.label = Label(text="Choose the info to exclude (if any) on the \n left." 
           "Write the number of the tags that should \n be associated with the information on the right.") 
     self.label.pack() 

     self.frame = VerticalScrolledFrame(root) 
     self.frame.pack() 


     buttons = [] 
     resource=[] 
     label=[] 
     for i in range(10): 
      frame = Frame(self.frame.interior) 
      frame.pack(side=TOP) 

      buttons.append(Checkbutton(frame, text=str(i)+". "+ "Button")) 
      resource.append(Entry(frame, width=3)) 
      label.append(Label(frame,text="Name: Ryan")) 

      buttons[-1].pack(side=LEFT) 
      label[-1].pack(side=LEFT) 
      resource[-1].pack(side=LEFT) 

Stapel um den Rahmen in eine Spalte side=TOP, und ordnet den Inhalt jedes Rahmens in eine Zeile unter Verwendung side=LEFT.

enter image description here

+0

Dies funktioniert nicht sehr gut, wenn die Länge jedes Etiketts unterschiedlich ist. –