Fix Linux GUI issue

This commit is contained in:
erew123 authored and GitHub committed 2024-10-04 11:32:52 +01:00
1 parent 0c95094892
commit 0c5e1c44c8
1 file changed
+50 -25
+50 -25
View File
@@ -14,9 +14,10 @@ import traceback
import signal
from pathlib import Path
from datetime import datetime
import winreg
from importlib.metadata import version as get_version, PackageNotFoundError
from packaging import version
if platform.system() == "Windows":
import winreg
# Check and install psutil if necessary
try:
@@ -48,14 +49,14 @@ try:
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QLabel,
QFileDialog, QTableWidget, QTableWidgetItem, QHeaderView, QSplitter, QFrame)
from PyQt6.QtGui import QColor, QDropEvent, QDragEnterEvent, QFont
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtCore import Qt, QTimer, QCoreApplication
except ImportError:
print("PyQt6 not found. Installing...")
subprocess.run([sys.executable, '-m', 'pip', 'install', 'PyQt6'])
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QLabel,
QFileDialog, QTableWidget, QTableWidgetItem, QHeaderView, QSplitter, QFrame)
from PyQt6.QtGui import QColor, QDropEvent, QDragEnterEvent, QFont
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtCore import Qt, QTimer, QCoreApplication
def input_with_timeout(prompt, timeout):
@@ -109,7 +110,6 @@ def check_visual_cpp_build_tools():
found_tools = []
# Check file system
for base_path in possible_locations:
if os.path.exists(base_path):
for year in ["2022", "2019", "2017", "2015"]:
@@ -127,14 +127,6 @@ def check_visual_cpp_build_tools():
if os.path.exists(common_path):
found_tools.append(f"Visual Studio {year} (Full) (Path: {vs_path})")
# Check registry for Visual C++ Redistributable
try:
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64") as key:
version = winreg.QueryValueEx(key, "Version")[0]
found_tools.append(f"Visual C++ 2015-2022 Redistributable (x64) - {version}")
except WindowsError:
pass # Key not found, redistributable might not be installed
return found_tools
def check_windows_sdk():
@@ -757,7 +749,8 @@ class PackageComparisonTool(QWidget):
main_layout.addWidget(instructions)
# Windows-specific information
self.windows_info_layout = QHBoxLayout()
self.windows_info_widget = QWidget()
self.windows_info_layout = QHBoxLayout(self.windows_info_widget)
self.cpp_build_tools_label = QLabel("C++ Build Tools: <span style='color: gray;'>Checking...</span>")
self.sdk_label = QLabel("Windows SDK: <span style='color: gray;'>Checking...</span>")
self.espeak_ng_label = QLabel("Espeak-ng: <span style='color: gray;'>Checking...</span>")
@@ -766,8 +759,7 @@ class PackageComparisonTool(QWidget):
self.windows_info_layout.addWidget(self.sdk_label)
self.windows_info_layout.addWidget(self.espeak_ng_label)
main_layout.addLayout(self.windows_info_layout)
main_layout.addSpacing(10) # Add some space between Windows info and file inputs
main_layout.addWidget(self.windows_info_widget)
# File inputs
file_layout = QHBoxLayout()
@@ -991,11 +983,12 @@ class PackageComparisonTool(QWidget):
sdks = check_windows_sdk()
espeak_ng_version = check_espeak_ng()
self.update_label(self.cpp_build_tools_label, "Windows C++ Build Tools", 'Found' if build_tools else 'Not Found')
self.update_label(self.cpp_build_tools_label, "C++ Build Tools", 'Found' if build_tools else 'Not Found')
self.update_label(self.sdk_label, "Windows SDK", 'Found' if sdks else 'Not Found')
self.update_label(self.espeak_ng_label, "Windows Espeak-ng", 'Installed' if espeak_ng_version else 'Not Found')
self.update_label(self.espeak_ng_label, "Espeak-ng", 'Installed' if espeak_ng_version else 'Not Found')
self.windows_info_widget.show()
else:
self.windows_info_layout.setVisible(False)
self.windows_info_widget.hide()
def update_label(self, label, title, status):
color = "green" if status in ['Found', 'Installed'] else "red"
@@ -1045,6 +1038,21 @@ def clear_screen():
else:
os.system("clear")
def is_running_in_gui():
return os.environ.get('DISPLAY') is not None or os.environ.get('WAYLAND_DISPLAY') is not None
def show_linux_instructions():
print("\n\033[93m Linux System Detected\033[0m")
print(" If the GUI wont start, you may need to install additional dependencies.")
print(" Please run one of the following commands based on your distribution:\n")
print("\033[96m For Ubuntu, Debian, and derivatives:\033[0m")
print(" sudo apt-get install libxcb-xinerama0 libxcb-cursor0 libxkbcommon-x11-0\n")
print("\033[96m For Fedora, CentOS, RHEL, and other RPM-based systems:\033[0m")
print(" sudo dnf install libxcb libxkbcommon-x11 libxcb-xinerama libxcb-cursor")
print(" - or -")
print(" sudo yum install libxcb libxkbcommon-x11 libxcb-xinerama libxcb-cursor\n")
print("\033[93m After installing these packages, please restart the diagnostic tool.\033[0m\n")
def show_menu():
print("\n\n\n\033[94m AllTalk Diagnostics Tool Menu\033[0m")
print("\n Ensure you have started AllTalk'a Python Environment with the start_environment file")
@@ -1069,9 +1077,20 @@ def main():
print(f"\033[94m / _ \ | | |\033[1;35m | |/ _` | | |/ / \033[0m | | | | \___ \ ")
print(f"\033[94m / ___ \| | |\033[1;35m | | (_| | | < \033[0m | | | | ___) |")
print(f"\033[94m /_/ \_\_|_|\033[1;35m |_|\__,_|_|_|\_\ \033[0m |_| |_| |____/ ")
app = QApplication(sys.argv)
# Check for GUI environment on non-Windows systems
if platform.system() != 'Windows' and not is_running_in_gui():
print("No graphical environment detected. Using offscreen rendering.")
os.environ["QT_QPA_PLATFORM"] = "offscreen"
try:
app = QApplication(sys.argv)
except Exception as e:
print(f"Failed to initialize QApplication: {e}")
print("Attempting to use offscreen platform...")
os.environ["QT_QPA_PLATFORM"] = "offscreen"
app = QApplication(sys.argv)
# Use a timer to check for the exit flag
timer = QTimer()
timer.timeout.connect(lambda: check_exit(app))
@@ -1086,13 +1105,18 @@ def main():
input(" Press Enter to return to the main menu...")
clear_screen()
elif choice == '2':
if platform.system() != "Windows":
show_linux_instructions()
try:
print("\n Diagnostics GUI Window is currently open. Close it to return to the Menu.")
print("\n Attempting to open Diagnostics GUI Window...")
ex = PackageComparisonTool()
ex.show()
print(" If you don't see a window, it might be hidden or there is a display issue.")
print(" Press Ctrl+C to return to the menu if no window appears.")
app.exec()
print(" GUI window closed.")
except Exception as e:
print(f"Error initializing PackageComparisonTool: {str(e)}")
print(f"Error initializing or running PackageComparisonTool: {str(e)}")
traceback.print_exc()
clear_screen()
elif choice == '9':
@@ -1101,7 +1125,8 @@ def main():
break
else:
print(" Invalid choice. Please try again.")
clear_screen()
cleanup_logging()
app.quit()
@@ -1111,4 +1136,4 @@ def check_exit(app):
app.quit()
if __name__ == "__main__":
main()
main()