use Qt signals to connect to gui

This commit is contained in:
Oliver Hartmann 2023-01-04 15:02:34 +01:00
parent c0fff4e59d
commit 594626ce7e
3 changed files with 51 additions and 31 deletions

17
main.py
View File

@ -1,7 +1,9 @@
from argparse import ArgumentParser, Namespace from argparse import ArgumentParser, Namespace
from threading import Thread from threading import Thread
from src import config, gui, trader, clipboard from src import config, trader, clipboard
# from src import gui
from src.pyside6 import gui_pyside6
from src.data import compile_regex, log from src.data import compile_regex, log
@ -19,10 +21,13 @@ if __name__ == "__main__":
conf = config.read_config(args.configfile) conf = config.read_config(args.configfile)
log.debug('Compiling regex') log.debug('Compiling regex')
compile_regex(conf) compile_regex(conf)
app = gui.Gui() # app = gui.Gui()
reader_thread = Thread(target=trader.read_log, args=(conf['General']['log_file'], app)) app, window = gui_pyside6.start_app()
reader = trader.Log_Reader(window)
reader_thread = Thread(target=reader.read_log, args=(conf['General']['log_file'], window))
log.debug(f'Starting reader thread for "{conf["General"]["log_file"]}"') log.debug(f'Starting reader thread for "{conf["General"]["log_file"]}"')
reader_thread.start() reader_thread.start()
clipboard_thread = Thread(target=clipboard.clipboard_poll, args=(app,)) # clipboard_thread = Thread(target=clipboard.clipboard_poll, args=(app,))
clipboard_thread.start() # clipboard_thread.start()
app.mainloop() app.exec()
# app.mainloop()

View File

@ -4,6 +4,7 @@ from src.data import Message, compile_regex
from src.pyside6.trade_widget import TradeCollection from src.pyside6.trade_widget import TradeCollection
from PySide6 import QtCore from PySide6 import QtCore
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QTabWidget from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QTabWidget
import qdarktheme
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
@ -22,6 +23,7 @@ class MainWindow(QMainWindow):
self.main_widget.tabCloseRequested.connect(self.del_tab) self.main_widget.tabCloseRequested.connect(self.del_tab)
self.setCentralWidget(self.main_widget) self.setCentralWidget(self.main_widget)
@QtCore.Slot()
def new_trade(self, message: Message): def new_trade(self, message: Message):
if message.trade: if message.trade:
unique_item = message.trade.unique_item() unique_item = message.trade.unique_item()
@ -48,6 +50,14 @@ class MainWindow(QMainWindow):
self.hide() self.hide()
def start_app():
app = QApplication(sys.argv)
qdarktheme.setup_theme()
app.setStyle('Material')
window = MainWindow()
return app, window
if __name__ == "__main__": if __name__ == "__main__":
conf = config.read_config(r'config.yaml') conf = config.read_config(r'config.yaml')
compile_regex(conf) compile_regex(conf)
@ -60,16 +70,13 @@ if __name__ == "__main__":
message = Message.from_text(text) message = Message.from_text(text)
message2 = Message.from_text(text2) message2 = Message.from_text(text2)
message3 = Message.from_text(text3) message3 = Message.from_text(text3)
app = QApplication(sys.argv)
app.setStyle('Material')
window = MainWindow()
assert message assert message
assert message2 assert message2
assert message3 assert message3
app, window = start_app()
window.new_trade(message) window.new_trade(message)
window.new_trade(message) window.new_trade(message)
window.new_trade(message2) window.new_trade(message2)
window.new_trade(message3) window.new_trade(message3)
app.exec() app.exec()

View File

@ -3,27 +3,35 @@ from .data import Message
from . import gui from . import gui
from .data import log from .data import log
from io import TextIOWrapper from io import TextIOWrapper
from PySide6 import QtCore
def read_log(logfile: str, app: gui.Gui) -> None: class Log_Reader(QtCore.QObject):
try: new_trade_signal = QtCore.Signal(Message)
with open(logfile, 'r', encoding='utf8') as file:
loglines = follow(file)
for line in loglines:
message = Message.from_text(line)
log.debug(message)
if message and message.trade and message.to_from == 'From':
log.debug(message.trade)
app.add_tab(30, message)
except IOError:
log.error(f'Error opening log file {logfile}.')
def __init__(self, window):
super().__init__()
self.new_trade_signal.connect(window.new_trade, QtCore.Qt.QueuedConnection)
def follow(thefile: TextIOWrapper): def read_log(self, logfile: str, app) -> None:
thefile.seek(0, 2) try:
while True: with open(logfile, 'r', encoding='utf8') as file:
line = thefile.readline() loglines = self.follow(file)
if not line: for line in loglines:
time.sleep(0.1) message = Message.from_text(line)
continue log.debug(message)
yield line if message and message.trade and message.to_from == 'From':
log.debug(message.trade)
# app.add_tab(30, message)
self.new_trade_signal.emit(message)
except IOError:
log.error(f'Error opening log file {logfile}.')
def follow(self, thefile: TextIOWrapper):
thefile.seek(0, 2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.1)
continue
yield line