main_windows.py 4.6 KB

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