2017-07-12 2 views
3

Ich erstelle drei "Message Widgets", aber sie scheinen sich in der Breite und Höhe entsprechend dem Inhalt zu verändern, ist es möglich, so etwas zu verhindern?Wie man Tkinter Nachrichtenwidget von der Größenänderung stoppt?

from tkinter import * 

root = Tk() 
root.configure(background = 'Yellow') 
root.geometry('500x400') 

a = '{}'.format('The Elepthan is Big') 
b = '{}'.format('The Bird') 
c = '{}'.format('The Lion is big and ferocious, kills any animal') 

msg = Message(root, text = a, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack() 


msg = Message(root, text = b, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack() 

msg = Message(root, text = c, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack() 




root.mainloop() 
+0

Ja, es ist möglich. Stellen Sie uns ein Beispiel des Codes zur Verfügung, den Sie zum Erstellen der Nachrichtenwidgets verwenden, und wir können Ihnen sagen, was Ihnen fehlt, um die Größenänderung zu verhindern. Es kann sein, dass Sie Ihrem Raster etwas Gewicht hinzufügen müssen. –

+1

Bitte geben Sie eine [mcve] an, die die Probleme veranschaulicht, die Sie haben. –

+0

@BryanOakley Fertig, ich möchte alle Message-Widgets mit gleicher Breite, aber sie ändern die Größe je nach Inhalt - espktro vor 8 Minuten – espktro

Antwort

3

UPDATE:

Sie haben ein paar Optionen hier aber nach Ihren Kommentar widgets resize according to their content, I want them all with same width Ich werde das Beispiel geben, die Ihren Bedarf am besten passt die pack() Geometrie Manager.

für Packung mindestens die einfachste Option ist pack(fill = BOTH)

Der schnellste Weg zu tun, um zu tun, was Sie wollen, ist, einen Rahmen zu verwenden. Der Rahmen wird die Größe auf den größten Text und die Verwendung von pack(fill = BOTH) auf alle Ihre Nachricht Widgets erweitern die kleineren auf die Größe des Rahmens, der auch die Größe des größten Widget ist.

from tkinter import * 

root = Tk() 
root.configure(background = 'Yellow') 
root.geometry('500x400') 

a = '{}'.format('The Elepthan is Big') 
b = '{}'.format('The Bird') 
c = '{}'.format('The Lion is big and ferocious, kills any animal') 

frame = Frame(root) 
frame.pack() 

msg = Message(frame, text = a, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack(fill=BOTH) 


msg = Message(frame, text = b, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack(fill=BOTH) 

msg = Message(frame, text = c, width=300, justify='left') 
msg.config(bg='lightgreen',relief=RIDGE, font=('times', 9), pady=-2, borderwidth=3) 
msg.pack(fill=BOTH) 

root.mainloop() 
+0

Was ist mit einer festen Breite und nicht mit der übergeordneten Breite? Frame = 400 Nachricht = 270 ... entweder mit Gitter oder Pack, ich brauche nur alle Message-Widgets mit der gleichen Breite (270), aber nicht die Breite des Eltern-Widget (400). – espktro

+0

Es gibt einige Optionen. Eine besteht darin, die Gittergrößenanpassung des Rahmens zu deaktivieren, so dass der Rahmen gezwungen wird, eine festgelegte Breite beizubehalten. Ich weiß, es gibt andere Möglichkeiten, aber ich muss darüber nachdenken. Ich werde sehen, was ich finden kann. –

2

Sie können es tun, indem die Breite der längsten Nachricht zu finden, und dann unter Verwendung der Message des Widgets padx Option innerhalb dieser Länge Wert alle von ihnen zentriert. Hier ein Beispiel:

from tkinter import * 
import tkinter.font as tkFont 

root = Tk() 
root.configure(background='Yellow') 
root.geometry('500x400') 

a = 'The Elepthan is Big' 
b = 'The Bird' 
c = 'The Lion is big and ferocious, kills any animal' 
messages = a, b, c 

msgfont = tkFont.Font(family='times', size=9) 
maxwidth = max(msgfont.measure(text) for text in messages) # get pixel width of longest one 

for text in messages: 
    msg = Message(root, text=text, width=maxwidth, justify='left') 
    padx = (maxwidth-msgfont.measure(text)) // 2 # padding needed to center text 
    msg.config(bg='lightgreen', relief=RIDGE, font=msgfont, padx=padx, pady=-2, borderwidth=3) 
    msg.pack() 

root.mainloop() 

Ergebnisse:

enter image description here

+0

Wäre es nicht einfacher, nur einen Rahmen zu verwenden und die Größe mit 'pack (fill = BOTH) selbst zu ändern' –

+0

@Sierra: Ja, wenn alles in einen Rahmen eingefügt werden kann - was vom Gesamtdesign abhängt und was sonst noch passiert. Die Methode, die in meiner Antwort gezeigt wird, ist vielleicht mehr involviert, aber zeigt an, wie man 'Message'-Widgets steuert, ohne das zu tun (und wie man die benötigten Werte berechnet). – martineau

+1

ty für die Erklärung :) –

Verwandte Themen