2016-06-30 5 views
0

Stellen Sie ein 4x4-Raster in einem Fenster dar. Ich möchte die Zelle in Zeile 2, Spalte 2 erweitern, aber nicht alles andere in Zeile 2 oder Spalte 2. Im Entwerfen eines Textfensters mit auswählbaren Optionen auf der linken Seite in den Zeilen 1-15. Wenn man Zeile 2 mit Gewicht 1 und Spalte 2 mit Gewicht 1 macht, kann mein Text-Widget erweitert werden, aber auch alles andere in Zeile 2 und Spalte 2. Irgendwo anders herum?Python3.5 -konfigurieren Sie eine einzelne Zelle zum Erweitern statt der gesamten Zeile oder Spalte

from tkinter import * 

root = Tk() 


lbl1 = Label(root, text="label1") 
lbl1.grid(row=0, column=1) 

lbl2 = Label(root, text="label2") 
lbl2.grid(row=1, column=0) 

lbl3 = Label(root, text="label3") 
lbl3.grid(row=3, column=0) 

lbl4 = Label(root, text="label4") 
lbl4.grid(row=5, column=0) 

txt = Text(root, state='disabled', bg='#E8E8E8') 
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2,  rowspan=2) 


root.rowconfigure(2, weight=1) 
root.columnconfigure(2, weight=1) 

root.mainloop() 

Beispiel 2:

from tkinter import * 

root = Tk() 
frame1 = Frame(root) 
frame1.grid(row=0, column=1) 
frame2 = Frame(root) 
frame2.grid(row=1, column=0) 
frame3 = Frame(root) 
frame3.grid(row=1, column=1, rowspan=2, columnspan=2) 


lbl1 = Label(frame1, text="label1") 
lbl2 = Label(frame2, text="label2") 
lbl3 = Label(frame2, text="label3") 
lbl4 = Label(frame2, text="label4") 

lbl1.grid(row=0, column=1, sticky=N) 
lbl2.grid(row=3, column=0, sticky=N) 
lbl3.grid(row=5, column=0, sticky=N) 
lbl4.grid(row=7, column=0, sticky=N) 

txt = Text(frame3, state='disabled', bg='#E8E8E8') 
txt.grid(row=0, column=0, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=2) 


root.rowconfigure(2, weight=1) 
root.columnconfigure(2, weight=1) 
frame3.rowconfigure(0, weight=1) 
frame3.columnconfigure(0, weight=1) 
root.mainloop() 

Beispiel 2 hat alles, was in der Position, die ich es in wollen, aber der Text-Widget sich nicht ausdehnt. Ist es möglich, einen Rahmen zum Erweitern bei der Verwendung von Gittern festzulegen?

+0

Ich denke ohne ein konkretes Beispiel wird dies schwer zu beantworten sein. Es ist eine Antwort, aber die richtige Antwort hängt von vielen Variablen ab.Angenommen, Sie möchten, dass es nach rechts erweitert wird. Was erwarten Sie dann von den Widgets auf der rechten Seite in derselben Zeile? Verschieben sie sich? Überschrieben werden? Das Gleiche gilt für die vertikale Erweiterung - was passiert mit den Elementen in den Reihen darunter? Wie viel Expansion kann passieren? Kann der Artikel in Zeile 2 Spalte 2 doppelt so groß sein? verdreifachen? Kann es den ganzen Bildschirm füllen? Kann es vollständig verschwinden? Haben Sie die Möglichkeit, die Benutzeroberfläche zu ändern? –

+0

Beispiel oben hinzugefügt. Ich möchte nur das Text-Widget erweitern, wenn das Fenster maximiert ist oder ein Benutzer die Ecke des Fensters zieht. Ich möchte, dass die Labels 2-4 links oben nebeneinander liegen und nicht getrennt sind. Ich hoffe das hilft. – sidnical

Antwort

1

Eine Möglichkeit wäre, Ihr Raster doppelt so groß zu machen, indem Sie die Elemente so einstellen, dass sie auf zwei Spalten/Zeilen erweitert werden können.

I.e. Sie verwenden ausschließlich ungerade nummerierte Zeilen/Spalten für grid ([1,1] [1,3], [3,1] [3,3] ...) und setzen geradzahlige Zeilen/Spalten, um ein Gewicht zu erhalten . Alles, was Sie in eine oder beide Richtungen erweitern möchten, erhält eine columnspan oder rowspan von 2, schieben Sie es in eine Zeile/Spalte, die bei Bedarf erweitert werden kann.

+0

Ich gebe das eine Chance. – sidnical

+0

Dies funktioniert nicht. Wenn ich die Tools auf 0, 2, 3, 4 usw. lege, lasse Zeile 1 neben meinem Text-Widget in Zeile 1 leer. Dann mache dasselbe mit meinen Spalten und habe nur mein Text-Widget in Spalte 1. Wenn ich es ändere Die Größe des tkinter-Fensters Spalte 1 und Zeile 1 werden erweitert, wodurch das Text-Widget erweitert werden kann, aber auch die anderen Werkzeuge in den Zeilen 2+ nach unten geschoben werden und Zeile 1 wird zu dieser riesigen Lücke. Wenn ich Rahmen statt nur Fenster einstellen könnte, würde ich das tun, aber es scheint nicht zu funktionieren. Irgendwelche anderen Ideen? – sidnical

+0

Haben Sie die 'rowspan'- und' columspan'-Argumente für das 'grid' auf Ihrem' Text' spezifiziert? – Delioth

2

Ihre Frage fragt nach einem 4x4-Gitter, aber Ihr Beispiel zeigt nur zwei Spalten. Das macht es schwer zu verstehen, was Sie wollen. In den Kommentaren, die du sagst, möchtest du einfach, dass der Textbereich des Beispiels wächst und schrumpft und alle Labels zusammen, so dass ich das anspreche.

Die einfachste Lösung ist eine zusätzliche Zeile und Spalte rechts und unterhalb des Textbereichs. Lassen Sie das Text-Widget in diese Bereiche übergreifen und geben Sie diesen Bereichen ein Gewicht von 1. Das bedeutet, dass bei der Änderung der Größe des Fensters zusätzlicher Speicherplatz Bereichen zugewiesen wird, die nicht mit Schaltflächen belegt sind.

pro Tipp: Ich finde Layout Probleme viel einfacher zu visualisieren und zu lösen, wenn alle Layout-Code zusammen ist.

Es würde wie folgt aussehen:

lbl1.grid(row=0, column=1) 
lbl2.grid(row=1, column=0) 
lbl3.grid(row=2, column=0) 
lbl4.grid(row=3, column=0) 
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=4) 

root.rowconfigure(4, weight=1) 
root.columnconfigure(2, weight=1) 

Ich denke, Ihr Layout Probleme könnten besser durch pack stattdessen das Layout Teil grid Verwendung gelöst werden. eine Symbolleiste, eine Seitenwand, und dann Hauptbereich mit dem Text-Widget: Zum Beispiel könnten Sie mit drei Bereichen begonnen

toolbar = Frame(root, ...) 
side = Frame(root, ...) 
main = Frame(root, ...) 

toolbar.pack(side="top", fill="x") 
side.pack(side="left", fill="y") 
main.pack(side="right", fill="both", expand=True) 

Damit Sie haben nun drei relativ unabhängige Bereiche. Sie können pack oder grid unabhängig voneinander in jedem dieser Frames verwenden, wodurch es viel einfacher ist, Zeilen und Spalten zu verfolgen.

+0

Ich wusste nicht, dass ich Pack und Grid so mischen könnte. Ich versuche es mal. – sidnical

+0

Wenn Sie die Grid-Konfiguration für alles in einem Abschnitt festlegen, erleichtert dies auch die Verwaltung. Dank dafür. – sidnical

+0

@sidnical: Sie können Grid und Pack in einer Anwendung mischen, Sie können nicht beide für Widgets, die die gleiche Eltern haben. –

0

Mit den Informationen, die jeder zur Verfügung gestellt hat, konnte ich mir eine Lösung einfallen lassen. Ich habe das Text-Widget im Hauptfenster statt in einem Rahmen gelassen und meine Etiketten/Werkzeuge in Rahmen gesetzt. Grundsätzlich wird die Tatsache verwendet, dass ein Frame nicht erweitert wird, um die Labels zu sperren. Jetzt, wenn das Fenster erweitert wird, wächst nur das Widget.

from tkinter import * 

root = Tk() 
frame1 = Frame(root) 
frame1.grid(row=0, column=1) 
frame2 = Frame(root) 
frame2.grid(row=1, column=0) 


lbl1 = Label(frame1, text="label1") 
lbl2 = Label(frame2, text="label2") 
lbl3 = Label(frame2, text="label3") 
lbl4 = Label(frame2, text="label4") 

lbl1.grid(row=0, column=1, sticky=N) 
lbl2.grid(row=3, column=0, sticky=N) 
lbl3.grid(row=5, column=0, sticky=N) 
lbl4.grid(row=7, column=0, sticky=N) 

txt = Text(root, state='disabled', bg='#E8E8E8') 
txt.grid(row=1, column=1, padx=10, pady=10, sticky="NSEW", columnspan=2, rowspan=2) 


root.rowconfigure(2, weight=1) 
root.columnconfigure(2, weight=1) 
root.mainloop() 

Vielen Dank für die Hilfe.

Verwandte Themen