2017-04-17 1 views
0

Je veux créer une interface graphique avec Tkinter, de sorte que vous êtes dans une épicerie, vous entrez l'article, le prix et la quantité, et chaque élément apparaîtra sur le dessus partie de l'écran.Comment positionner des widgets en utilisant tkinter (entrées, étiquettes)

J'ai un cadre supérieur et inférieur, et quand je place une entrée il va droit au milieu du cadre inférieur. J'ai essayé de justifier la position à gauche, de l'ancrer, de la coller et de faire n'importe quoi, mais ça ne bouge pas.

Ceci est mon 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

Parlez-vous de l'objet 'foodItemEntry'? Si oui, voulez-vous dire que l'objet, le champ 'Tk.Entry' est placé au milieu du' Tk.Frame' en bas et vous souhaitez spécifier sa position dans le bas 'Tk.Frame'? – pstatix

Répondre

0

-Utiliser

bottomFrame.grid_propagate(False) 

d'élargir le cadre et

storeItemEntry.grid(pady=30) 

Ou quelle que soit la valeur que vous voulez pour pady. Vous devrez peut-être donner les numéros row et column à grid() si vous souhaitez placer d'autres widgets dans bottomFrame.

Vous avez vu "un étrange fond gris foncé" comme mentionné dans le commentaire parce que vous avez donné bg = "grey" à bottomFrame. L'arrière-plan n'était pas visible initialement parce que le cadre a rétréci pour s'adapter à la Entry. Vous pouvez changer la couleur à ce que vous voulez ou l'enlever entièrement.

Ce qui suit devrait être proche de ce que vous cherchez:

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

MISE À JOUR: Sur la base de vos commentaires, voici une mise en œuvre difficile de travailler avec.

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

Un couple de choses à noter:

  1. J'ai enlevé certains de vos cadres parce qu'ils semblaient redondants, vous pouvez les ajouter si nécessaire.
  2. Puisque vous travaillez avec une classe, j'ai ajouté le mot-clé self à certains des attributs afin que je puisse les utiliser/les appeler plus tard dans d'autres méthodes sans erreurs. J'ai omis les attributs que je n'ai pas besoin d'appeler après la création.
  3. StringVar/textvariable n'est pas nécessaire puisque vous mettez à jour la liste en cliquant sur un bouton.
  4. Il y a beaucoup d'améliorations que je n'ai pas faites (c'est-à-dire vérifier si une entrée valide est donnée avant de mettre à jour la liste, la capacité de supprimer de la liste, etc.).
  5. I ont utilisé des méthodes et fonctionnalités que vous pouvez ou ne pouvez pas être au courant (.ljust(50)[:50], %s, etc.)

J'espère que cela aide :).

+0

'grip_propagate' permet au cadre de changer de taille pour s'adapter au widget enfant, le changer en' false' empêche le changement automatique.Vous pouvez ajouter des entrées supplémentaires, il vous suffit de fournir les numéros 'row' et' column' appropriés où vous voulez les placer dans 'grid'. – Khristos

+0

Vous pouvez en savoir plus sur [grid_propagate here] (http://effbot.org/tkinterbook/grid.htm#Tkinter.Grid.grid_propagate-method) – Khristos

+0

textvariable avec StringVar vous permet de suivre les modifications apportées au widget Entry, ou définit le contenu . [Plus de ce lien.] (Http://effbot.org/tkinterbook/variable.htm). Oui, vous pouvez afficher l'aliment et le prix sur le cadre supérieur. Comment voulez-vous le faire? Voulez-vous l'afficher après avoir cliqué sur un bouton? Ou vous voulez l'afficher pendant qu'il est tapé? Je vais essayer de modifier la réponse pour inclure cela, mais vous devrez peut-être poser une nouvelle question avec des détails à la réponse exacte que vous voulez. – Khristos