#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, которые я обычно использую для получения информации о виджетах: это