Проблема переноса значений из Arduino в Python

#python #arduino

Вопрос:

Я написал программу на Python, которая извлекает значения из Arduino. Однако, когда у меня открыто окно графического интерфейса, Python не может считывать значения с Arduino, и в окне графического интерфейса ничего не происходит. Если я удалю код, содержащий окно графического интерфейса, программа будет работать и сможет извлекать значения из Arduino. Кто — нибудь знает, почему это происходит?

 import serial  # 引用pySerial模組
from os import close
from tkinter.font import Font
#from bluetooth.widcomm import stop_advertising
import cv2
import numpy as np
from tkinter import*
from tkinter.constants import BOTTOM
#from typing import Text#假設tk=tkinter
import tkinter
from PIL import Image, ImageTk



COM_PORT = 'COM7'    # 指定通訊埠名稱
BAUD_RATES = 9600    # 設定傳輸速率
ser = serial.Serial(COM_PORT, BAUD_RATES)   # 初始化序列通訊埠
while True:
        win=Tk()#建立視窗
        win.title("點餐系統")#標題
        win.geometry("1540x1050")#寬X高
        win.maxsize(width=1520,height=1050)
        img1=PhotoImage(file="D:PYTHONPROJECT大麥克.png")
        img2=PhotoImage(file="D:PYTHONPROJECT勁辣雞腿堡.png")
        img3=PhotoImage(file="D:PYTHONPROJECT雙層吉事堡.png")
        img4=PhotoImage(file="D:PYTHONPROJECT蕈菇黑牛堡.png")
        print('aaa')
        a='aaa'
        btn=Button(text="雙層吉事堡")
        btn.config(width=400,height=300)
        btn.config(image=img3)
        btn.place(x=300,y=480)
        lb3=Label(fg="black",text="三號餐",font='30')
        lb3.place(x=475,y=450) 
        while ser.in_waiting:          # 若收到序列資料…
                 data_raw= ser.readline()  # 讀取一行
                 data= data_raw.decode()   # 用預設的UTF-8解碼
                 print('接收到的原始資料:', data_raw)
                 print('接收到的資料:', data)
        if(bytes(data)=="solar1low"):
                    print('接收到的原始資料:', data_raw)
                    print('接收到的資料:', data)
                    win.destroy()#關閉舊視窗
                    win2=Tk()
                    win2.title("點餐系統")
                    win2.geometry("1540x1050")
                    image3=Image.open("D:PYTHONPROJECT雙層吉事堡.png")
                    雙層吉事堡=ImageTk.PhotoImage (image3)
                    labelnext1=tkinter.Label(image=雙層吉事堡)
                    labelnext1.image=雙層吉事堡
                    labelnext1.config(width=650,height=650)
                    labelnext1.place(x=450,y=100)
                    btnnext1=Button(win2,text="確認餐點",fg='black',font='500',)
                    btnnext1.place(x=1400,y=700)
                    btnnext2=Button(win2,text="取消",fg='black',font='500')
                    btnnext2.place(x=1300,y=700)
                    lbnext2=Label(win2,fg="black",text="三號餐 100元",font='30')
                    lbnext2.place(x=700,y=50)
                    win2.mainloop()#常駐主視窗
        win.mainloop()#常駐主視窗
        

 

Комментарии:

1. Вам нужно часто обновляться.

2. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.

Ответ №1:

Вот как должен выглядеть код:

 import serial  # 引用pySerial模組
from os import close
from tkinter.font import Font
#from bluetooth.widcomm import stop_advertising
import cv2
import numpy as np
from tkinter import*
from tkinter.constants import BOTTOM
#from typing import Text#假設tk=tkinter
import tkinter
from PIL import Image, ImageTk



COM_PORT = 'COM7'    # 指定通訊埠名稱
BAUD_RATES = 9600    # 設定傳輸速率
ser = serial.Serial(COM_PORT, BAUD_RATES)   # 初始化序列通訊埠
while True:
        win=Tk()#建立視窗
        win.title("點餐系統")#標題
        win.geometry("1540x1050")#寬X高
        win.maxsize(width=1520,height=1050)
        img1=PhotoImage(file="D:PYTHONPROJECT大麥克.png")
        img2=PhotoImage(file="D:PYTHONPROJECT勁辣雞腿堡.png")
        img3=PhotoImage(file="D:PYTHONPROJECT雙層吉事堡.png")
        img4=PhotoImage(file="D:PYTHONPROJECT蕈菇黑牛堡.png")
        print('aaa')
        a='aaa'
        btn=Button(text="雙層吉事堡")
        btn.config(width=400,height=300)
        btn.config(image=img3)
        btn.place(x=300,y=480)
        lb3=Label(fg="black",text="三號餐",font='30')
        lb3.place(x=475,y=450) 
        while ser.in_waiting:          # 若收到序列資料…
                    data_raw= ser.readline()  # 讀取一行
                    data= data_raw.decode()   # 用預設的UTF-8解碼
                    print('接收到的原始資料:', data_raw)
                    print('接收到的資料:', data)
        if(bytes(data)=="solar1low"):
                    print('接收到的原始資料:', data_raw)
                    print('接收到的資料:', data)
                    win.destroy()#關閉舊視窗
                    win2=Tk()
                    win2.title("點餐系統")
                    win2.geometry("1540x1050")
                    image3=Image.open("D:PYTHONPROJECT雙層吉事堡.png")
                    雙層吉事堡=ImageTk.PhotoImage (image3)
                    labelnext1=tkinter.Label(image=雙層吉事堡)
                    labelnext1.image=雙層吉事堡
                    labelnext1.config(width=650,height=650)
                    labelnext1.place(x=450,y=100)
                    btnnext1=Button(win2,text="確認餐點",fg='black',font='500',)
                    btnnext1.place(x=1400,y=700)
                    btnnext2=Button(win2,text="取消",fg='black',font='500')
                    btnnext2.place(x=1300,y=700)
                    lbnext2=Label(win2,fg="black",text="三號餐 100元",font='30')
                    lbnext2.place(x=700,y=50)
                    win2.mainloop()#常駐主視窗
        win.update()
 

Обратите внимание, как в конце я звоню win.update() вместо win.mainloop() . Запуск win.update() просто обновляет окно, а затем движется дальше. Вызов win.mainloop() блокирует запуск вашего кода до тех пор, пока окно не закроется.

Если у вас все еще возникают проблемы, попробуйте win2.mainloop() win2.update() также сделать перестановку.