簡體   English   中英

多線程中的按鈕問題 Python Tkinter 串行監視器

[英]Button problem in multi-threading Python Tkinter Serial Monitor

我嘗試創建一個串行監視器,它可以使用 Tkinter 作為 GUI 從串行端口發送和接收消息。 當程序搜索新數據時,我做了兩個線程,因為沒有凍結的 GUI。


Tkinter GUI 很簡單:

  • 1 輸入要發送的文本
  • 1 label 用於顯示收到的消息
  • 1個按鈕用於發送Entry消息

我的問題是當我運行程序時,我點擊按鈕,什么也沒發生。 我認為當我開始我的兩個線程時按鈕不再加載。 我該怎么做才能解決這個問題?

import threading
from tkinter import *
import tkinter as tk
import serial
root = tk.Tk()
COM = "COM3"
ser = serial.Serial(port=COM, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, timeout=2)
ser.isOpen()
msg = ""


# read Serial
def ReadSerial():
    global msg
    msg = ""
    msg = ser.readline()[:-2].decode("utf-8")
    if msg != "":
        print(msg)
        
    return msg
# write Serial
def WriteSerial(sendmsg):
    print("send")
    ser.write(bytes(sendmsg, 'utf-8'))
    ReadSerial()


# Tkinter
root.title("WIP NAME")
root.geometry("650x400")
inputData = Entry(root, text="<Slave1&p>") # input for enter the message to write
entrymsg = inputData.get() # get the massage
buttonMsg = Button(root, text="send", command = WriteSerial(entrymsg)) # create a send button for send the message
readData = Label(root, text=msg) # show message in Tkinter
ReadSerial()
# show items
inputData.grid()
readData.grid()
buttonMsg.grid()


# GUI thread
def TkinterGui():
    while 1==1:
        global msg
        entrymsg = inputData.get()


# Serial thread
def SerialProgram():
    while 1==1:
        ReadSerial()
        readData.update_idletasks()


x = threading.Thread(target=TkinterGui, args=())
y = threading.Thread(target=SerialProgram, args=())
x.start()
y.start()

root.mainloop()

非常感謝@acw1668,我已經在這個項目上工作了一周。 那正確的命令:

buttonMsg = Button(root, text="send", command = lambda: WriteSerial(inputData.get()))

和整個代碼:

import threading
from tkinter import *
import tkinter as tk
import serial
root = tk.Tk()
COM = "COM3"
ser = serial.Serial(port=COM, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, timeout=2)
ser.isOpen()
msg = ""


# read Serial
def ReadSerial():
    global msg
    msg = ""
    msg = ser.readline()[:-2].decode("utf-8")
    if msg != "":
        print(msg)
        
    return msg
# write Serial
def WriteSerial(sendmsg):
    print("send")
    ser.write(bytes(sendmsg, 'utf-8'))
    ReadSerial()


# Tkinter
root.title("WIP NAME")
root.geometry("650x400")
inputData = Entry(root, text="<Slave1&p>") # input for enter the message to write
entrymsg = inputData.get() # get the massage
buttonMsg = Button(root, text="send", command = lambda: WriteSerial(inputData.get())) # create a send button for send the message
readData = Label(root, text=msg) # show message in Tkinter
ReadSerial()
# show items
inputData.grid()
readData.grid()
buttonMsg.grid()


# GUI thread
def TkinterGui():
    while 1==1:
        global msg
        entrymsg = inputData.get()


# Serial thread
def SerialProgram():
    while 1==1:
        ReadSerial()
        readData.update_idletasks()


x = threading.Thread(target=TkinterGui, args=())
y = threading.Thread(target=SerialProgram, args=())
x.start()
y.start()

root.mainloop()

PS:對不起,如果我的英語不是很容易理解,我是法國人:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM