Tengo el siguiente código, que funciona en Windows, pero falla en Linux con X11:
#! /usr/bin/env python3 """Tkinter crashes on X11 when popup windows are closed after calling glfw.init() """ from sys import exit from tkinter import Tk from tkinter.messagebox import showinfo from glfw import init class MainWindow(Tk): """Main window.""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not init(): exit(2) showinfo('Close me', 'I dare you') def main(): """Run the script.""" MainWindow().mainloop() if __name__ == '__main__': main()Después de hacer clic en Aceptar en el cuadro de mensaje en Linux/X11, el programa falla con:
X Error of failed request: BadWindow (invalid Window parameter) Major opcode of failed request: 15 (X_QueryTree) Resource id in failed request: 0x4c0000a Serial number of failed request: 778 Current serial number in output stream: 778 Las direcciones varían después de cada ejecución, pero el error general sigue siendo el mismo.
Pude reducir el problema a la llamada de glfw.init() que da como resultado el cierre posterior de tkinter Windows para bloquear el programa. Sin embargo, esto no sucede en los sistemas Windows.
Algo de información del sistema:
$ uname -r 5.16.16-arch1-1 $ pacman -Q xorg-server xorg-server 21.1.3-6 $ echo $XDG_SESSION_TYPE x11 $ pacman -Q glfw python-glfw glfw-x11 3.3.6-1 python-glfw 2.1.0-2 ¿Por qué este programa falla en mi sistema?
¿Qué puedo hacer para que funcione como en Windows?
No soy un experto en esto, pero si solo desea tener un código que funcione, debe llamar a glfw.init() antes super().__init__() de esta manera:
from tkinter import Tk from tkinter.messagebox import showinfo from glfw import init class MainWindow(Tk): """Main window.""" def __init__(self, *args, **kwargs): if not init(): exit(2) super().__init__(*args, **kwargs) showinfo('Close me', 'I dare you') def main(): """Run the script.""" MainWindow().mainloop() if __name__ == '__main__': main() Creo que es mejor poner glfw.init() en main antes de MainWindow().mainloop() , pero quería dejar en claro que creo que el problema está directamente en super().__ini__() .
No probé ninguna función de glfw, solo verifiqué esto debido a otras preguntas sobre SO
Aquí hay algunos enlaces que puede consultar, tal vez puedan ayudar: proyecto de código togl