main_windows.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import queue
  2. import re
  3. import sys
  4. import threading
  5. from PySide2.QtWidgets import QApplication, QMainWindow
  6. from PySide2.QtUiTools import QUiLoader
  7. from PySide2.QtWidgets import *
  8. from PySide2.QtCore import *
  9. from PySide2 import QtCore
  10. from PySide2.QtGui import QTextCursor
  11. from ui.ui_MainWindows import Ui_MainWindow
  12. from ui.Analyze import AnalyzeWindow
  13. from sub_windows import SubWindows
  14. class Stream(QObject):
  15. """Redirects console output to text widget."""
  16. newText = Signal(str)
  17. def __init__(self):
  18. super().__init__()
  19. self.stdout_bak = sys.stdout
  20. self.buffer = self.stdout_bak.buffer
  21. self.close = self.stdout_bak.close
  22. self.closed = self.stdout_bak.closed
  23. self.detach = self.stdout_bak.detach
  24. self.encoding = self.stdout_bak.encoding
  25. self.errors = self.stdout_bak.errors
  26. self.fileno = self.stdout_bak.fileno
  27. self.flush = self.stdout_bak.flush
  28. self.isatty = self.stdout_bak.isatty
  29. self.line_buffering = self.stdout_bak.line_buffering
  30. self.mode = self.stdout_bak.mode
  31. self.name = self.stdout_bak.name
  32. self.newlines = self.stdout_bak.newlines
  33. self.read = self.stdout_bak.read
  34. self.readable = self.stdout_bak.readable
  35. self.readline = self.stdout_bak.readline
  36. self.readlines = self.stdout_bak.readlines
  37. self.reconfigure = self.stdout_bak.reconfigure
  38. self.seek = self.stdout_bak.seek
  39. self.seekable = self.stdout_bak.seekable
  40. self.tell = self.stdout_bak.tell
  41. self.truncate = self.stdout_bak.truncate
  42. self.writable = self.stdout_bak.writable
  43. self.write_through = self.stdout_bak.write_through
  44. self.writelines = self.stdout_bak.writelines
  45. def write(self, text:str):
  46. self.stdout_bak.write(str(text))
  47. self.stdout_bak.flush()
  48. if len(text) == 0:
  49. return
  50. if text.isspace():
  51. return
  52. self.newText.emit(str(text+'\n'))
  53. class MainWindow(Ui_MainWindow, QMainWindow):
  54. textEdit_sig = Signal(str)
  55. sig = Signal(object)
  56. def __init__(self, GUI) -> None:
  57. super().__init__()
  58. self.setupUi(self)
  59. # 这里显示一下是为了能获取到 mdiArea 的尺寸,给 sub_windows 使用
  60. self.show()
  61. self.loader = QUiLoader()
  62. self.actionReport_Virtual_Timing.triggered.connect(self.add_sub_win)
  63. self.textEdit.document().contentsChanged.connect(self.textEdit_change_size)
  64. self.textEdit.document().contentsChange.connect(self.textEdit_change_contents)
  65. sys.stdout = Stream()
  66. sys.stdout.newText.connect(self.outputWritten)
  67. sys.stderr = sys.stdout
  68. self.GUI = GUI
  69. self.setWindowTitle(GUI.Title)
  70. self.sub_win = SubWindows(self)
  71. self.sub_win.sig.connect(self.sub_win.add_windows)
  72. self.actionAnalyze.triggered.connect(self.show_analyze_window)
  73. def show_analyze_window(self):
  74. d = AnalyzeWindow(self)
  75. d.exec_()
  76. def outputWritten(self, text):
  77. cursor = self.LogText.textCursor()
  78. cursor.movePosition(QTextCursor.End)
  79. cursor.insertText(text)
  80. self.LogText.setTextCursor(cursor)
  81. self.LogText.ensureCursorVisible()
  82. def textEdit_change_size(self):
  83. height = self.textEdit.document().size().height()
  84. self.textEdit.setMinimumHeight(height)
  85. def textEdit_change_contents(self, from_index, charsRemoved, charsAdded):
  86. if not charsAdded:
  87. return
  88. stdin = self.textEdit.toPlainText()
  89. if not stdin:
  90. return
  91. # 捕获回车键
  92. if stdin[from_index] != '\n':
  93. return
  94. # 回车时,判断字符串代码是否结束
  95. if self.GUI.Shell_IsCmdFinished(stdin):
  96. # 删除回车字符
  97. stdin = stdin[:from_index] + stdin[from_index+1:]
  98. print(stdin)
  99. thread = threading.Thread(target=self.GUI.Shell_Execute, args=(stdin,))
  100. thread.start()
  101. self.textEdit.setText('')
  102. self.textEdit_change_size()
  103. def add_sub_win(self):
  104. print('add sub')
  105. self.t = self.loader.load("ui/TimingAnalyze.ui")
  106. self.mdiArea.addSubWindow(self.t)
  107. self.t.show()