亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python如何在不干擾主代碼循環的情況下使用Tkinter GUI

Python如何在不干擾主代碼循環的情況下使用Tkinter GUI

慕慕森 2023-06-27 13:46:12
我想為我的項目實現一個非常簡單的 GUI。我以前只使用 Print 語句來輸出一些文本和數據。然而,這不是很方便,因為一個人需要操作我正在編碼的設備,所以他需要清楚地看到我將在 GUI 上顯示的指令。我的代碼:main()myConnection = mysql.connector.connect( host=hostname, user=username, passwd=password, db=database )counter = 0window = tk.Tk()window.title("GUI")window.geometry("400x200")while(1):    # OPERACIJOS KODAI:    # 0 - PILDYMAS    # 1 - KOMPLEKTAVIMAS    # 2 - NETINKAMAS KODAS    tk.Label(window,text = "Scan barcode here:").pack()    entry = tk.Entry(window)    entry.pack()    var = tk.IntVar()    button = tk.Button(window,text="Continue",command = lambda: var.set(1))    button.pack()    print("waiting...")    button.wait_variable(var)    result = entry.get()    print("Entry string=",result)    var.set(0)        operacijos_kodas=Scanning_operation(myConnection,result)    print("operacijos kodas=",operacijos_kodas)    if(operacijos_kodas == 0):        tk.label(window,text = "PILDYMO OPERACIJA:").pack()        pildymo_operacija(myConnection)               elif(operacijos_kodas == 1):        tk.Label(window,text = "PAKAVIMO OPERACIJA:").pack()        insertData_komplektacija(myConnection,"fmb110bbv801.csv");        update_current_operation(myConnection);        picking_operation();            elif(operacijos_kodas == 2):        print("Skenuokite dar karta")        #break   window.mainloop();沒有顯示任何內容。它只是打開一個空的 GUI 窗口。首先,我不確定應該在哪里調用 function window.mainloop()。其次,由于我的系統在無限的 while 循環中運行(當用戶掃描條形碼時操作開始,然后他完成操作并且 while 循環再次開始(等待用戶掃描條形碼)。所以我只需要顯示一些文本并允許用戶在文本框中輸入數據。有人可以建議我這個 GUI 是否適合我的需求,或者我應該尋找替代品嗎?
查看完整描述

1 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

您需要調整代碼以與 GUI 配合使用。您無法在 tkinter GUI 中引入無限循環而不引起各種問題。


Mainloop 應該只被調用一次。


我建議您將所有掃描/保存操作移至一個單獨的函數中,您計劃使用 tkinterafter方法定期執行該函數。


例如,如果您調用函數,scan您可以使用以下命令將其安排在 1 秒后發生


root.after(1000, scan)

更高級的方法是讓掃描代碼在單獨的線程上運行。


此外,您當前嘗試在每次循環 while 循環時創建標簽,而不是僅創建和打包它們一次并在執行“掃描”時更新標簽的文本。您可以使用 config 方法更新標簽的文本,例如


## Create a label

label1 = tk.Label(window,text = "PAKAVIMO OPERACIJA:")

##Pack the label

label1.pack()


## Update the text later

label1.config(text="New Text")

以下是從函數定期更新 tkinter 小部件的示例。


import tkinter as tk

import random


def scanning():

    num = random.randint(0,100)

    entryTemperature.delete(0, tk.END) #Delete the current contents

    entryTemperature.insert(0, f"{num} K") #Add new text

    root.after(1000, scanning) #Schedule the function to run again in 1000ms (1 second)



root = tk.Tk()

entryTemperature = tk.Entry(root)

entryTemperature.grid(padx=50,pady=50)


root.after(1000, scanning)

root.mainloop()

    


查看完整回答
反對 回復 2023-06-27
  • 1 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號