Попробуйте вызвать tkiner.showwarning в потоке, когда я использую python tkiner, он не отвечает - PullRequest
0 голосов
/ 06 мая 2018

Когда я пытаюсь вызвать tkinter.show предупреждение в потоке после того, как что-то сделано, если нажата кнопка, gui не будет отвечать и окно сообщений не будет отображаться, это демонстрационные коды, пожалуйста, помогите:

```python
 # coding=utf-8  
from tkMessageBox import *
from Tkinter import *
import thread  
def show_alert(title, msg):
    showwarning(title=title, message=msg)  
def onclick():
    try:
        thread.start_new_thread(show_alert, ("test", "hahahaha!"))
    except Exception as e:
        print "error:", e  
if __name__ == "__main__":
    _root = Tk()
    _root.resizable(width='false', height='false')
    _root.title("Test")
    _submitButton = Button(_root, text="submit", width=10, command=onclick)
    _submitButton.pack(side=RIGHT, padx=20)
    _root.mainloop()
```

1 Ответ

0 голосов
/ 07 мая 2018

Ваша проблема, возможно, связана с многопоточностью в Python 2 и с некоторыми модулями - в данном случае с Tkinter. У меня не очень хороший опыт работы с потоками в Python 2. Иногда в простых случаях это работает нормально, но когда что-то более сложное, потоки в Python 2 с некоторыми модулями могут быть непредсказуемыми. Потоки в Python 3 гораздо более оптимизированы.

Так что в вашем случае у вас есть две возможности.

1) Поднимите вашу версию до Python 3, а именно в эти дни Python 3.6.

Код в Python 3 немного отличается, но в этом случае работает, как талисман, в соответствии с вашими ожиданиями.

from tkinter.messagebox import *
from tkinter import *
import _thread

def show_alert(title, msg):
    showwarning(title=title, message=msg)

def onclick():
    try:
        _thread.start_new_thread(show_alert, ("test", "hahahaha!"))
    except Exception as e:
        print("error:", e)

if __name__ == "__main__":
    _root = Tk()
    _root.resizable(width='false', height='false')
    _root.title("Test")
    _submitButton = Button(_root, text="submit", width=10, command=onclick)
    _submitButton.pack(side=RIGHT, padx=20)
    _root.mainloop()

2) Если вам нужно остаться с Python 2, постарайтесь избежать многопоточности, чтобы вы могли вызывать showwarning непосредственно в onclick()

from tkMessageBox import *
from Tkinter import *

def onclick():
    try:
        showwarning(title="test", message="hahahaha!")
    except Exception as e:
        print "error:", e

if __name__ == "__main__":
    _root = Tk()
    _root.resizable(width='false', height='false')
    _root.title("Test")
    _submitButton = Button(_root, text="submit", width=10, command=onclick)
    _submitButton.pack(side=RIGHT, padx=20)
    _root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...