如何使用tkinter(条目,标签)定位小部件

时间:2017-04-17 00:38:27

标签: python tkinter tkinter-canvas

我想用Tkinter创建一个GUI,这样你就可以进入杂货店,输入商品,价格和数量,每个商品都会显示在屏幕的顶部。

我有一个顶部和底部框架,当我放置一个条目时,它就在底部框架的中间。我试过把左边的位置证明是正确的,固定它,粘住它并做任何事情,但是它没有移动。

这是我的代码。

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

1 个答案:

答案 0 :(得分:0)

- 使用

bottomFrame.grid_propagate(False)

展开框架和

storeItemEntry.grid(pady=30)

或者pady所需的任何值。如果您要在row中放置其他小部件,则可能需要向column提供grid()bottomFrame个号码。

您在评论中看到了“一个奇怪的深灰色背景”,因为您向bg = "grey"提供了bottomFrame。背景最初不可见,因为框架缩小以适合Entry。您可以将颜色更改为您想要的颜色或完全删除它。

以下内容应该与您正在寻找的内容相近:

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

更新: 根据您的意见,这是一个粗略的实现。

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

有几点需要注意:

  1. 我删除了一些框架,因为它们似乎是多余的,您可以根据需要添加它们。
  2. 由于您正在使用某个类,因此我将self关键字添加到某些属性中,以便稍后在其他方法中使用/调用它们而不会出现错误。我遗漏了创建后我不需要调用的属性。
  3. 由于您只需点击一下按钮即可更新列表,因此不需要
  4. StringVar / textvariable
  5. 我没有做很多改进(例如,在更新列表之前检查是否有有效输入,从列表中删除的能力等)。
  6. 我使用了您可能或可能不知道的方法和功能(.ljust(50)[:50]%s等)
  7. 我希望这会有所帮助:)。