#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()
также сделать перестановку.