2017-04-17 9 views
0

Ich möchte eine GUI mit Tkinter erstellen, so dass Sie in einem Lebensmittelgeschäft sind, geben Sie den Artikel, Preis und Menge, und jedes Element wird auf der Oberseite angezeigt Teil des Bildschirms.Wie Widgets mit tkinter (Einträge, Etiketten) positionieren

Ich habe einen oberen und unteren Rahmen, und wenn ich einen Eintrag platziere, geht es genau in der Mitte des unteren Rahmens. Ich habe versucht, die Position nach links zu rechtfertigen, sie zu verankern, anzukleben und alles zu tun, aber sie bewegt sich nicht.

Dies ist mein Code.

from Tkinter import * 

root = Tk() 
root.title("project") 
root.geometry("700x850+0+0") 

textInput = StringVar() 

class MenuBoard(object): 
    def __init__(self,master): 
     self.master = master 
     mainFrame = Frame(self.master,bg = "white",width=700,height=400) 
     mainFrame.grid(row=0,column=0) 

     labelFrame = Frame(self.master, bg = "red",height=40,width=700) 
     labelFrame.grid(row=0,column=0,sticky = N) 

     welcomeLabel = Label(self.master, text = "",fg= "black",bg="red",) 
     welcomeLabel.config(font=("Courier New",23)) 
     welcomeLabel.grid(row=0,column=0,sticky = N) 


actual = MenuBoard(root) 
root.mainloop() 
+0

Sprechen Sie über das 'foodItemEntry'-Objekt? Wenn ja, meinst du, dass das Objekt, das 'Tk.Entry'-Feld in der Mitte des unteren' Tk.Frame' platziert wird und du seine Position innerhalb des unteren 'Tk.Frame' angeben willst? – pstatix

Antwort

0

-Use

bottomFrame.grid_propagate(False) 

den Rahmen und

storeItemEntry.grid(pady=30) 

oder was auch immer Wert, den Sie für pady wollen erweitern. Sie müssen möglicherweise row und column Nummern an grid() geben, wenn Sie andere Widgets in bottomFrame platzieren möchten.

Sie sah „eine seltsame dunkelgrauen Hintergrund“ wie im Kommentar erwähnt, weil man bg = "grey"-bottomFrame gab. Der Hintergrund war anfangs nicht sichtbar, da der Rahmen schrumpfte, um die Entry zu passen. Sie können die Farbe zu dem ändern, was Sie möchten, oder es vollständig entfernen.

sollte folgende Nähe zu dem, was Sie suchen:

from Tkinter import * 

root = Tk() 
root.title("project") 
root.geometry("700x850+0+0") 

textInput = StringVar() 

class MenuBoard(object): 
    def __init__(self,master): 
     self.master = master 
     mainFrame = Frame(self.master,bg = "white",width=700,height=400) 
     mainFrame.grid(row=0,column=0) 

     labelFrame = Frame(self.master, bg = "red",height=40,width=700) 
     labelFrame.grid(row=0,column=0,sticky = N) 

     welcomeLabel = Label(self.master, text = "Main Heading Here",fg= "black",bg="red",) 
     welcomeLabel.config(font=("Courier New",23)) 
     welcomeLabel.grid(row=0,column=0,sticky = N) 

     bottomFrame = Frame(self.master, bg = "grey", height=450,width=700) #Change/remove bg 
     bottomFrame.grid(row=1, column=0) 
     bottomFrame.grid_propagate(False) 

     storeItemEntry = Entry(bottomFrame, font=("Courier New",10,"bold"), textvariable=textInput, bd =4) 
     storeItemEntry.grid(pady=30) 


actual = MenuBoard(root) 
root.mainloop() 

UPDATE: Basierend auf Ihre Kommentare, hier eine grobe Umsetzung zu arbeiten.

from Tkinter import * 

root = Tk() 
root.title("project") 
root.geometry("700x850+0+0") 


class MenuBoard(object): 
    def __init__(self,master): 
     self.master = master 

     mainFrame = Frame(self.master,bg = "white",width=700,height=400) 
     mainFrame.grid(row=0,column=0) 
     mainFrame.grid_propagate(False) 
     mainFrame.grid_columnconfigure(0, weight=1) 

     heading = " Store Item".ljust(45)[:45] + "Item Price" # Pad the text with white spaces 
     listHeading = Label(mainFrame, text=heading, anchor="w", font=("Courier New",14,"bold")) 
     listHeading.grid(row=1, column=0, pady=5, stick="we") 

     # Use Text widget so you can keep inserting items 
     self.listItems = Text(mainFrame, font=("Courier New",12)) 
     self.listItems.grid(row=2, column=0, pady=5, stick="we") 
     self.listItems.config(state="disabled") # Prevents edits on the Text 

     welcomeLabel = Label(mainFrame, text = "Main Heading Here",fg= "black",bg="red",) 
     welcomeLabel.config(font=("Courier New",23)) 
     welcomeLabel.grid(row=0,column=0, stick="we") 

     bottomFrame = Frame(self.master, bg = "grey", height=450,width=700) #Change/remove bg 
     bottomFrame.grid(row=1, column=0) 
     bottomFrame.grid_propagate(False) 

     storeItemLabel = Label(bottomFrame, text="Food Item: ") 
     storeItemLabel.grid(row=0, column=0) 

     self.storeItemEntry = Entry(bottomFrame, font=("Courier New",10,"bold"), bd =4) 
     self.storeItemEntry.grid(row=0, column=1, pady=15) 

     priceLabel = Label(bottomFrame, text="Price: ") 
     priceLabel.grid(row=2, column=0) 

     self.priceEntry = Entry(bottomFrame, font=("Courier New",10,"bold"), bd =4) 
     self.priceEntry.grid(row=2, column=1,) 

     btn = Button(bottomFrame, text="Add Item", command=self.add) 
     btn.grid(row=3, column=1, pady=15) 

    def add(self): 
     price = self.storeItemEntry.get() # Get item name from Entry 
     #Get price, format name and price 
     groceryItem = price.ljust(50)[:50] + "$%s" %(self.priceEntry.get()) 
     self.listItems.config(state="normal") # Enable edits on the Text 
     self.listItems.insert("end", "\n "+groceryItem) # Edit Text 
     self.listItems.config(state="disabled") # Prevents edits on the Text 


actual = MenuBoard(root) 
root.mainloop() 

Ein paar Dinge zu beachten:

  1. ich einige Ihrer Frames entfernt, weil sie überflüssig schien, können Sie sie zurück, wenn nötig hinzufügen.
  2. Da Sie mit einer Klasse arbeiten, habe ich das Schlüsselwort self zu einigen der Attribute hinzugefügt, damit ich sie später in anderen Methoden ohne Fehler verwenden/aufrufen kann. Ich habe die Attribute weggelassen, die ich nach der Erstellung nicht aufrufen muss.
  3. StringVar/textvariable wird nicht benötigt, da Sie die Liste mit einem Klick aktualisieren.
  4. Es gibt viele Verfeinerungen, die ich nicht gemacht habe (d. H. Prüfen, ob eine gültige Eingabe vor dem Aktualisieren der Liste, der Fähigkeit, aus der Liste zu löschen, usw.).
  5. verwenden I Methoden und Funktionen, die Sie oder nicht bewusst sein können (.ljust(50)[:50], %s, etc)

Ich hoffe, das hilft :).

+0

'grip_propagate' ermöglicht es dem Rahmen, die Größe an das Kind-Widget anzupassen, indem er auf' false' geändert wird, um die automatische Änderung zu verhindern.Sie können zusätzliche Einträge hinzufügen, Sie müssen nur die entsprechenden 'row'- und' column'-Nummern angeben, wo sie in 'grid' platziert werden sollen. – Khristos

+0

Sie können mehr über [grid_propagate hier] lesen (http://effbot.org/tkinterbook/grid.htm#Tkinter.Grid.grid_propagate-method) – Khristos

+0

textvariable mit StringVar können Sie Änderungen an das Widget Eintrag verfolgen oder legt Inhalt fest . [Mehr von diesem Link.] (Http://effbot.org/tkinterbook/variable.htm). Ja, Sie können das Lebensmittel und den Preis auf dem oberen Rahmen anzeigen. Wie willst du es machen? Möchten Sie es nach dem Klicken auf eine Schaltfläche anzeigen? Oder möchten Sie es während der Eingabe anzeigen? Ich werde versuchen, die Antwort zu bearbeiten, um sie einzuschließen, aber Sie müssen möglicherweise eine neue Frage mit Details zur genauen Antwort stellen, die Sie wünschen. – Khristos

Verwandte Themen