а l oop в GUI с Tkinter - PullRequest
       6

а l oop в GUI с Tkinter

0 голосов
/ 10 июля 2020

Я новичок в области Tkinter. У меня есть небольшая задача создать GUI с помощью Tkinter. Мне просто нужно несколько кнопок, например Read data, stop Read data и quit. Здесь данные поступают через последовательный порт.

Я создал код. Моя идея заключается в том, что когда я нажимаю кнопку Read data, он должен go, а l oop, и там он должен прочитать данные и распечатать их на GUI. Когда я нажимаю stop Read data, он должен перестать читать его.

Однако, когда я нажимаю кнопку Read data, он будет, пока l oop и GUI висит там. Я не могу нажать ни одну кнопку и не вижу данных.

Вот мой код:

import tkinter as tk
import serial,time
import datetime
import array as arr

addr = "COM10" ## serial port to read data from
baud = 115200 ## baud rate for instrument
ser = serial.Serial(
    port = addr,\
    baudrate = baud,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
    timeout=1)


class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.appName = tk.Button(self,fg="red", bg="blue")
        self.appName["text"] = "SCAN "
        self.appName.pack(side="top")
        

        self.startScanBtn = tk.Button(self,fg="red", bg="green")
        self.startScanBtn["text"] = "Start Scanning "
        self.startScanBtn["command"] = self.scan
        self.startScanBtn.pack(side="left")
        

        self.stopScanBtn = tk.Button(self,fg="black", bg="red")
        self.stopScanBtn["text"] = "Stop Scanning "
        self.stopScanBtn.pack(side="right")
        
        
        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")
        
    def scan(self):
        while(true):
            c = ser.readline() # attempt to read a character from Serial
            line = c.decode('utf-8').replace('\r\n', '')
            tk.Label(self,text = line).pack()        
root = tk.Tk()
app = Application(master=root)
app.mainloop()

1 Ответ

1 голос
/ 10 июля 2020

причина того, что ваш GUI перестает отвечать, потому что python занят в то время как l oop. Вы можете рассмотреть возможность использования многопоточности для использования функции сканирования в другом потоке, threading.thread будет хорошим местом для начала. Затем вам нужно будет отправить данные из потока сканирования в основной поток для отображения в GUI, PySubPub может в этом помочь. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...