Python GUI падает при перемещении - PullRequest
0 голосов
/ 27 февраля 2019

tl; dr: Почему мой GUI падает, когда я его перемещаю.

Привет, во-первых, да, я смотрю некоторые подобные сообщения здесь и в Google, возможно, я пропустил золотойяблоко, так что если на этот вопрос действительно ответили 40 раз, то я искренне сожалею.

Так что я использую Python, и мой сценарий в основном состоит из двух циклов, где вы «застряли» до нажатия клавишинажата и большая петля, которая содержит все действительно хорошие вещи.

Моя проблема - GUI, все работает отлично, проблема в том, что при взаимодействии с окнами происходит сбой.Я пытался выглядеть многопоточным, но мне не удалось заставить его работать так, как я хочу.А так как скрипт в основном "while 1:", я могу понять, что GUI не нравится ...

Сам GUI просто используется в качестве вывода, кнопки не нужны, и я неМне не нужна огромная частота обновления.

Я готов изменить большую часть своего кода, если это необходимо, я все еще на ранней стадии разработки.В особенности бросьте Tkinter, я «почти» уверен, что могу делать то, что хочу, с PyGame, но это кажется мне излишним.

Код ниже - это лишний ненужный код, только barebone, но если этот GUIне сбой, он должен работать для моего полного сценария.

import keyboard as kb
from tkinter import *
# Much more imports are needed for the full script
# Here I also define a lot of fonction use in the loop


def talk(string: str):
    """
    Update the UI witht he new text to output
    :param string: the strind to output
    :return: None
    """
    canvas.create_polygon([0, 0, 0, 125, 600, 125, 600, 0], fill="black", width=2)
    canvas.create_text(300, 100, text=string, font="terminal 20", fill="white")
    canvas.pack()
    root.update()


# Creating the ui
root = Tk()
canvas = Canvas(root, width=600, height=250, background='black')
canvas.create_line(50, 200, 550, 200, fill="red", width=3)
canvas.pack()
root.update()

Stop = False
while not Stop:                     # I do have way to stop this loop and shutdown the script properly
    PushToTalk = False
    talk("")                        # Reseting the output text
    while not PushToTalk:           # Stuck here until "pause" key is press
        if kb.is_pressed("pause"):
            PushToTalk = True

    talk("Yes ?")
    # Here are a lot of stuff happening
    # And the "talk" function is use a lot for upputing informations
print("Bye")

Надеюсь, вы можете помочь мне!

Lyxilion.

1 Ответ

0 голосов
/ 28 февраля 2019

Поскольку внутренний цикл while блокирует обновление вашего окна, вы можете добавить root.update() в конец внутреннего цикла while, как показано ниже:

Stop = False
while not Stop:                     # I do have way to stop this loop and shutdown the script properly
    PushToTalk = False
    talk("")                        # Reseting the output text
    while not PushToTalk:           # Stuck here until "pause" key is press
        if kb.is_pressed("pause"):
            PushToTalk = True
        root.update()  # let tkinter handle update    
    talk("Yes ?")
    # Here are a lot of stuff happening
    # And the "talk" function is use a lot for upputing informations
print("Bye")

Однако это не очень хорошая практика, используя whileпетля в основном потоке.Лучше поместить вышеуказанный блок кода в поток:

import keyboard as kb
from tkinter import *
import threading
# Much more imports are needed for the full script
# Here I also define a lot of fonction use in the loop


def talk(string: str):
    """
    Update the UI witht he new text to output
    :param string: the strind to output
    :return: None
    """
    canvas.itemconfig(msg, text=string)


# Creating the ui
root = Tk()
canvas = Canvas(root, width=600, height=250, background='black')
canvas.create_line(50, 200, 550, 200, fill="red", width=3)
msg = canvas.create_text(300, 100, text='welcome', font="terminal 20", fill="white")
canvas.pack()

Stop = False

def chat():
    while not Stop:
        talk("")
        while not kb.is_pressed("pause"): pass
        talk("Yes ?")
        # Here are a lot of stuff happening
        # And the "talk" function is use a lot for upputing informations
    print("Bye")

threading.Thread(target=chat, daemon=True).start()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...