Добавление кнопки (с переменными) нажатием кнопки — tkinter

#python #variables #tkinter #button #window

Вопрос:

Я создаю систему торговых точек и пытаюсь реализовать кнопку, при нажатии которой появляется новая кнопка, а также окно, в котором пользователю предлагается ввести товар

 def newButton ():
    w = Toplevel()
    w.title("New Item") #creates new window when button is pressed
    w.geometry("200x200")
    
    itemNameLabel = Label(w, font=("arial", 15), text="What is the item called?")
    itemNameLabel.grid(row=0, padx=5)
    itemName = Entry(w, width=18,  borderwidth=5)
    itemName.grid(row=1, padx=5)
    newItemName = itemName.get

    itemPriceLabel = Label(w, font=("arial", 15), text="What is the item's price?")
    itemPriceLabel.grid(row=4, padx=5)
    itemPrice = Entry(w, width=18,  borderwidth=5)
    itemPrice.grid(row=5, padx=5)

    def item6_Button():
        global item6_qty
        item6_price = itemPrice.get
        item6_text = newItemName
        item6_qty  = 1
        item6_text = (item6_text   "    " str(item6_price)  "    "  str(item6_qty)) #concatonates text amp; variable
        item6.config(text=item6_text) #updates label text - doesn't add multiple 
        item6.pack()

        item6_Button = Button(itemFrame, text=newItemName, width=10, height=5, command=item6_Button)
        item6_Button.grid(row=7, column=1, padx=5)
        item6 = Label(receiptFrame)
    w.mainloop()


newButton= Button(itemFrame, text="Add New Button", width=20, height=5, command=newButton) #creates button for new window
newButton.place(x=480, y=600)
newButton = Label(itemFrame)
 

*item6_qty и item6_price объявляются в начале программы

Это то, что у меня есть до сих пор, и хотя появляется окно, я не думаю, что переменные на самом деле установлены поверх новой кнопки, появляющейся в рамке элемента. Я не совсем уверен, как это сделать — нужно ли мне использовать .insert для переменных?

Это стандартный код, который у меня есть, который создает обычную кнопку

 #Item1 Button   Function
def item1_Button():
    global item1_qty #making qty variable global so it can used
    item1_text = ("Chips")
    item1_qty  = 1 #increments qty variable by one everytime button is clicked
    item1_text = (item1_text   "    " str(item1_price)  "    "  str(item1_qty)) #concatonates text amp; variable
    item1.config(text=item1_text) #updates label text - doesn't add multiple 
    item1.pack() #places label within the frame
    
    
item1_Button = Button(itemFrame, text="Chips", width=10, height=5, command=item1_Button)
#creates button   links to function
item1_Button.grid(row=4, column=1, padx=5) #positions button
item1 = Label(receiptFrame)#creates label for button
 

Желаемый продукт

Я не уверен, что предоставил достаточно кода того, что я сделал, чтобы дать лучшее представление о том, чего я пытаюсь достичь, но я знаю, что большие куски кода не очень приветствуются

Ответ №1:

вот пример того, что Вы могли бы сделать (помогает ли это?):

 from tkinter import Tk, Button, Entry, Toplevel


class MainWindow(Tk):
    def __init__(self):
        Tk.__init__(self)

        self.geometry('100x150')

        self.btn = Button(self, text='Create New!', command=self.ask)
        self.btn.pack()

    def ask(self):
        ask_window = InputWindow(self)
        ask_window.focus_force()
    
    def create(self, text):
        button = Button(self, text=text)
        button.pack()
    

class InputWindow(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)
        self.parent = parent
        self.bind('<FocusOut>', self.destroy_)

        self.user_input = Entry(self)
        self.user_input.pack()
        
        self.submit_btn = Button(self, text='Submit!', command=self.retrieve)
        self.submit_btn.pack()
        
    def retrieve(self):
        text = self.user_input.get()
        self.parent.create(text)
        self.destroy()

    def destroy_(self, event):
        if isinstance(event.widget, Toplevel):
            self.destroy()
        

root = MainWindow()
root.mainloop()
 

Комментарии:

1. привет! большое вам за это спасибо!! это работает идеально!! не могли бы вы объяснить, что делают функции InputWindow, извлечения и уничтожения? Я не очень хорошо знаком с классами, так что некоторые вещи не совсем имеют смысл, ага ^^

2. @STRhythm Входное окно-это класс, но по понятным причинам вы можете просто предположить, что это корзина, содержащая связанные функции и переменные. у него есть метод извлечения, который позволяет получать информацию из вариабелей «корзин», в частности из той, которая является записью, поэтому в основном это просто получение информации из поля ввода. часть уничтожения, как показано, не нужна, я просто хотел, чтобы она могла закрыться, если фокус этого окна переместится куда-то еще, так что в основном вы не получите огромное количество бесполезных окон. С таким же успехом вы можете просто уничтожить окно при нажатии X

3. Я надеюсь, что я был ясен, однако, если вы все еще не поняли, не стесняйтесь спрашивать, также вот учебник о занятиях, поэтому я предлагаю Вам посмотреть его.

4. @STRhythm если Вы спрашивали об этой части: ask_window = InputWindow(self) она просто инициирует класс InputWindow, это не функция, это класс, это похоже на то, чтобы сказать root = Tk() или button = Button(master)

5. также вот некоторые источники tkinter, которые я обычно использую для получения информации о виджетах: это