def EditItem(product):
print(product)
editbase = Tk()
editbase.title("Edit Item")
editbase.eval('tk::PlaceWindow . center')
main_frame = Frame(editbase)
main_frame.pack(fill=BOTH, expand=1)
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
my_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
second_frame = Frame(my_canvas)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
這就是我困擾的地方。
text_file = open('Cashier.txt') # I know it's better to use [with open()]
productname = []
counter = 0
for line in text_file:
print(counter)
line = line.strip('\n')
product = line.split("=")
productname.append(product[0])
productprice = product[1]
Button(second_frame, text=productname[counter], width=35, height=2, font=('Arial', 13, 'bold'),
command = lambda: EditItem(productname[counter])).grid(
row=counter, column=0, pady=10, padx=10)
counter += 1
counter = 0
exitbutton = Button(editbase, text="Exit", font=('Arial', 12), width=20, command=editbase.destroy)
exitbutton.pack(pady=10)
editbase.mainloop()
例如,當您打開此代碼時,將會有幾行產品按鈕名稱
牛奶
咖啡
巧克力
我想這樣做,當我按下咖啡按鈕時,裡面的產品EditItem
將是咖啡而不是牛奶,因為for
循環後的計數器將始終為 0,而且按鈕似乎不會向下傳遞其當前計數器。因此命令將通過EditItem(productname[0])
而不是EditItem(productname[currentcounter #Example only]
.
我也無法製作單個按鈕,因為產品的數量是動態的。
問題是由於閉包,這意味著對變量值的引用counter
是您的lambda
回調函數正在使用的值,並且該值將始終是for
循環結束執行時變量的最終值。
通常的方式,以避免該問題是指定一個默認值,以將“捕獲”變量的值函數參數的時候創建功能。下面的代碼顯示瞭如何在for
代碼末尾的循環中執行此操作。
注意我還簡化了其他一些我注意到在塊中效率低下/笨拙的事情。
...
with open('Cashier.txt') as text_file:
productname = []
for counter, line in enumerate(text_file):
print(counter)
line = line.strip('\n')
product = line.split("=")
productname.append(product[0])
productprice = product[1]
Button(second_frame, text=productname[counter], width=35, height=2,
font=('Arial', 13, 'bold'),
command=lambda counter=counter: # NOTE DEFAULT ARGUMENT VALUE ADDED.
EditItem(productname[counter])).grid(row=counter, column=0, pady=10, padx=10)
exitbutton = Button(editbase, text="Exit", font=('Arial', 12), width=20,
command=editbase.destroy)
exitbutton.pack(pady=10)
editbase.mainloop()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句