cuốn sách gpt4 ai đã làm

Python: Cách cập nhật GUI bằng cách sử dụng các biến từ một quy trình riêng biệt trong khi vẫn giữ GUI tương tác

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:43:38 28 4
mua khóa gpt4 Nike

Sau khi đọc rất nhiều ở đây về đa xử lý, đường ống, v.v. Tôi vẫn chưa tìm thấy câu trả lời, nhưng tôi xin lỗi nếu nó đã có.

Tôi có một phần cứng ngoại vi mà tôi đang cố gắng tạo GUI cho nó. Tôi muốn GUI được cập nhật liên tục bằng cách sử dụng dữ liệu từ các thiết bị ngoại vi trong khi vẫn duy trì khả năng tương tác của người dùng. Ví dụ: tôi có một tham số khuếch đại điều khiển biểu đồ thanh và trong khi nó liên tục cập nhật, tôi muốn người dùng có thể nhấp vào nút để thực hiện một số hành động. Đây là một số mã mẫu. Mặc dù tôi chắc chắn rằng mình đang làm điều gì đó sai nghiêm trọng ở đây, nhưng điều này thực sự gần như hoạt động, nhưng nút "Thoát" vẫn không phản hồi:

#!/usr/bin/env python`
# -*- mã hóa: utf-8 -*-
# 24-07-2014 S. Petit

nhập matplotlib.pyplot dưới dạng plt
từ nhập nối tiếp Nối tiếp
nhập nối tiếp, ổ cắm, thời gian, ngày giờ, sys, struct
từ ngày giờ nhập ngày giờ
nhập numpy dưới dạng np
nhập khẩu
hệ điều hành nhập khẩu
từ randint nhập khẩu ngẫu nhiên
từ nhập Tkinter *
từ nhập đa xử lý *

dcbSerialPort = 'COM10'

def getGainLNA(pipeToParent):
thử:
S_dcb = Nối tiếp(dcbSerialPort, 115200, hết thời gian=.1)
in 'Đã mở DCB tại', dcbSerialPort
ngoại trừ:
in '\r\n'
in '************************************************ *'
in 'LỖI: Không thể mở', dcbSerialPort, 'kết nối nối tiếp.'
in '************************************************ *'
in '\r\n'
raw_input()
ra()

while True:
nhắcFound = Sai
PICreturn = ''
S_dcb.write('đạt được\r')
trong khi không nhắcFound:
PICreturn += S_dcb.read(S_dcb.inWaiting())
nếu 'DCB>' trong PICreturn:
nhắcFound = Đúng

GainLNA = float(PIReturn[20:28].strip())
GainLNA_scaled = int(100*(gainLNA/33))

pipeToParent.send(gainLNA_scaled)

trở lại()

nếu __name__ == '__main__':

GainUpdaterPipe, GainUpdaterPipeChild = Pipe()

lnaGainUpdater = Quá trình(target=getGainLNA, args=(gainUpdaterPipeChild,))
lnaGainUpdater.start()

gốc=Tk()
root.title = 'AGC'

while True:
nếu GainUpdaterPipe.poll():
GainLNA = GainUpdaterPipe.recv()
in lợiLNA

quitButton = Button(text='Quit', command=quit)
quitButton.grid(row=1, cột=0)

vùngAGC = Canvas(width=120, high=100, bg='blue')
objectAGC = AreaAGC.create_polygon(20,20, GainLNA,20, GainLNA,50, 20,50, Outline='green', fill='vàng')
khu vựcAGC.grid(hàng=0, cột=0)

root.update_idletasks()

Cảm ơn sự giúp đỡ của bạn... Steve P

EDIT: Được rồi, sau khi thử ví dụ của @ebarr, đây là những gì tôi có. Tiện ích nhãn cập nhật số lượng, nhưng biểu đồ thanh thì không:

#!/usr/bin/env trăn
# -*- mã hóa: utf-8 -*-
# 24-07-2014 S. Petit

nhập matplotlib.pyplot dưới dạng plt
từ nhập nối tiếp Nối tiếp
nhập nối tiếp, ổ cắm, thời gian, ngày giờ, sys, struct
từ ngày giờ nhập ngày giờ
nhập numpy dưới dạng np
nhập khẩu
hệ điều hành nhập khẩu
từ randint nhập khẩu ngẫu nhiên
nhập Tkinter dưới dạng tk
từ nhập đa xử lý *

dcbSerialPort = 'COM10'

# đếm từ 0 đến vô cùng, ghi giá trị vào một pipe
số def (ống, dừng):
tôi = 0
trong khi không dừng lại.is_set():
ii+=1
pipe.send(ii)
thời gian.ngủ(1)

lớp Đang cập nhậtGUI(tk.Frame):
def __init__(bản thân, cha mẹ):
tk.Frame.__init__(bản thân, cha mẹ)
self.parent = cha mẹ
self.parent_pipe, self.child_pipe = Pipe()
self.stop_event = Sự kiện()

# nhãn để hiển thị giá trị đếm
self.update_int = tk.IntVar()
self.update_int.set(0)
self.update_lbl = tk.Label(self, textvariable=self.updated_int)
self.update_lbl.pack()

# bargraph để hiển thị giá trị đếm
self.area_barGraph = tk.Canvas(width=120, Height=100, bg='blue')
self.bargraph = self.area_barGraph.create_polygon(10,10, (10+self.update_int.get()),10, (10+self.update_int.get()),20, 10,20, phác thảo='green ', điền='màu vàng')
self.area_barGraph.pack()

# nút sẽ luôn phản hồi các yêu cầu trong khi quá trình đếm đang diễn ra
self.quit_btn = tk.Button(self,text="Quit",command=self.quit)
self.quit_btn.pack()

# số lần khởi chạy là một quá trình
self.counter = Quá trình(target=count,args=(self.child_pipe,self.stop_event))
self.counter.start()

# gọi phương thức cập nhật để kiểm tra đường ống và cập nhật nhãn
tự.update()

chắc chắn thoát (tự):
self.stop_event.set()
self.parent.destroy()

cập nhật def (tự):
# Trong khi pipe có dữ liệu, hãy đọc và cập nhật StringVar
trong khi self.parent_pipe.poll():
self.update_int.set(self.parent_pipe.recv())

# đặt phương thức cập nhật để chạy lại sau 1 giây
self.parent.after(1000,self.update)


chắc chắn chính():
gốc = tk.Tk()
gui = Đang cập nhậtGUI(root)
gui.pack()
root.mainloop()

# in __tên__

if __name__ == "__main__":
chủ yếu()

câu trả lời hay nhất

Bạn đang rất gần với một giải pháp khả thi. Như một trong những ý kiến ​​​​ở trên đã nêu, sử dụng tkinter after Sẽ giải quyết hầu hết các vấn đề của bạn.

Đây là một ví dụ tối thiểu về trạng thái chuyển một quy trình (chạy bộ đếm đơn giản) có thể được sử dụng để cập nhật GUI:

nhập Tkinter dưới dạng tk
từ nhập đa xử lý Sự kiện, Quy trình, Đường ống
từ lúc nhập giấc ngủ

# đếm từ 0 đến vô cùng, ghi giá trị vào một pipe
số def (ống, dừng):
tôi = 0
trong khi không dừng lại.is_set():
ii+=1
pipe.send(ii)
ngủ(1)

lớp Đang cập nhậtGUI(tk.Frame):
def __init__(bản thân, cha mẹ):
tk.Frame.__init__(bản thân, cha mẹ)
self.parent = cha mẹ
self.parent_pipe, self.child_pipe = Pipe()
self.stop_event = Sự kiện()

# nhãn để hiển thị giá trị đếm
self.update_txt = tk.StringVar()
self.updated_txt.set("Đang chờ...")
self.update_lbl = tk.Label(self, textvariable=self.update_txt)
self.update_lbl.pack()

# nút sẽ luôn phản hồi các yêu cầu trong khi quá trình đếm đang diễn ra
self.quit_btn = tk.Button(self,text="Quit",command=self.quit)
self.quit_btn.pack()

# số lần khởi chạy là một quá trình
self.counter = Quá trình(target=count,args=(self.child_pipe,self.stop_event))
self.counter.start()

# gọi phương thức cập nhật để kiểm tra đường ống và cập nhật nhãn
tự.update()

chắc chắn thoát (tự):
self.stop_event.set()
self.parent.destroy()

cập nhật def (tự):
# Trong khi pipe có dữ liệu, hãy đọc và cập nhật StringVar
trong khi self.parent_pipe.poll():
self.update_txt.set(self.parent_pipe.recv())

# đặt phương thức cập nhật để chạy lại sau 1 giây
self.parent.after(1000,self.update)


chắc chắn chính():
gốc = tk.Tk()
gui = Đang cập nhậtGUI(root)
gui.pack()
root.mainloop()

if __name__ == "__main__":
chủ yếu()

gia hạn

Đáp lại mã cập nhật: Bạn đã đạt được rất nhiều thành tựu, vấn đề duy nhất là bạn chỉ gọi người tạo biểu đồ thanh một lần và nó cần được thêm vào update chức năng, ví dụ:

cập nhật def (tự):
# Trong khi pipe có dữ liệu, hãy đọc và cập nhật StringVar
trong khi self.parent_pipe.poll():
self.update_int.set(self.parent_pipe.recv())
dx = self.update_int.get()
self.area_barGraph.create_polygon(10,10, (10+dx),10, (10+dx),20, 10,20, phác thảo='xanh', điền='vàng')
# đặt phương thức cập nhật để chạy lại sau 1 giây
self.parent.after(1000,self.update)

Điều này sẽ đảm bảo rằng mỗi khi intVar được cập nhật, biểu đồ cũng được cập nhật tương ứng.

Về Python: Cách cập nhật GUI với các biến từ một quy trình riêng biệt trong khi vẫn giữ GUI tương tác, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/24945357/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress