我在這裡有一個滾動條按鈕,我想問一下當我按下特定按鈕時如何獲得特定輸出

purr681
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在這裡,當我按下一個有效的空格時,我試圖更改 DirectionX 的值,但我必須多次按下才能更改

當我按下後退按鈕時,活動會發生什麼?

當我按下按鈕上傳圖像時顫動崩潰

當使用javascript按下按鈕或(切換)時,我們如何選擇所有段落?

當我按下按鈕時出現問題 我在控制台日誌中出現錯誤,提示我的函數未定義

我想點擊一個單選按鈕

這個 React Native 組件有什麼問題?我想在按下按鈕時更改方塊的顏色

每當我按下後退按鈕時,片段中的 JSON 就會增加

當一個按鈕大於另一個時如何將按鈕居中?

每次按下按鈕如何獲得新的輸入值?

Javascript 我如何動態地給一個變量我的按鈕的值?

我想當我點擊模態上的單選按鈕(objectart)時,它應該在另一個 div(objecttype)中更改模態上的其他 div 數據(獲取數據庫)

當我按下後退按鈕或移除鍵盤時,文本字段中的文本消失

您好,我正在嘗試創建一個不和諧音樂機器人,並且在我按下選擇按鈕時出現如下錯誤:“此交互失敗”

當我單擊按鈕時,如何使 <button> 在 console.log 中顯示特定文本?

當按下鍵盤上的按鈕時,如何使方塊移動?Tkinter,Python

在 r 上的特定條件下禁用按鈕

想清理一個 VBA 命令按鈕,但我很擅長編碼

當我點擊按鈕條目時不會顯示

當我點擊這個按鈕時,我想讓這個布爾值變為真。並將其傳遞給函數以在屏幕上顯示某些內容

僅當特定輸入為空時如何禁用按鈕?

jQuery:單擊按鈕時重置滾動條

如何編寫從(文本框)讀取文本的代碼,當我按下我的(按鈕)時,它會刪除文本中的所有點?

檢測何時同時按下 2 個按鈕而不對按下第一個按鈕時作出反應

為什麼我的按鈕在滾動時與導航欄重疊?

需要一個意圖過濾器,當我單擊主網站中的按鈕時運行我的應用程序

當我將其放入表單時,按鈕不會將我帶到另一個頁面

每次我按一下按钮,数据就会翻倍

我在 PHP 中有表格形式的數據,我需要的是,當兩列的值相同時,必須禁用該特定的按鈕