#python
#питон #tkinter
Вопрос:
Кнопка на ней не появляется , есть какие-нибудь советы, ребята?. Функция скриншота работает нормально, но не кнопка, я должен закрыть ее самостоятельно.
import time from tkinter import * import pyautogui class App: def __init__(self, master, task): frame = Frame(master) frame.pack() self.button = Button( frame, text="QUIT", fg="red", command=frame.quit ) self.button.pack(side=LEFT) frame.after(0,task) def task(): i = 1 while i gt; 0: myScreenshot = pyautogui.screenshot() myScreenshot.save(r"C:UserselsinDesktoppythonnameTask" str(i) ".png") time.sleep(2) i = 1 root = Tk() app = App(root,task()) root.mainloop()
Ошибка:
C:UserselsinPycharmProjectspythonProjectvenvScriptspython.exe C:/Users/elsin/PycharmProjects/pythonProject/1.py Traceback (most recent call last): File "C:UserselsinPycharmProjectspythonProject1.py", line 28, in lt;modulegt; app = App(root,task()) File "C:UserselsinPycharmProjectspythonProject1.py", line 23, in task time.sleep(2) KeyboardInterrupt Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl C)
Комментарии:
1. Разве так не должно быть
app = App(root,task)
?2. это не имеет значения,это одна и та же задача и задача(), без параметров, так что…
3. Нет,
()
если вы вызовете функцию. В любом случае,time.sleep
в том же потоке, что и tkinter, будет заблокирован основной интерфейс tkinter и графический интерфейс4. извините, но я не понял, нужно ли мне вводить команду ВРЕМЕНИ в конце класса?и все в порядке
5. Никогда не бывает нормально, чтобы это было в одной и той же теме
Ответ №1:
Во-первых: вы должны отправить имя функции без ()
.
В этот момент у вас есть что-то вроде
result = task() app = App(root, result)
но task()
выполняется while
-цикл, который выполняется все время, и код никогда не переходит в строку App(root, result)
, поэтому он не может его отобразить.
Если вы отправите имя функции, у вас возникнет еще одна проблема — вы frame.after(0, task)
сразу запустите эту задачу, и она заблокирует остальную часть кода.
Если вы используете некоторую задержку frame.after(100, task)
, то у него будет время, чтобы отобразить окно с кнопкой.
Но у него все еще есть проблема с task
тем, какой цикл выполнения while
, и он блокирует
and
, зависает tkinter mainloop.
Основная проблема заключается в том, что у вас есть два цикла, которые должны работать одновременно:
- Первый :
mainloop()
, - второе:
while
-петля
и для этого нужно запустить один из них в отдельном потоке, или вам придется использовать root.after(2000, task)
вместо while
sleep()
Кстати: вы должны использовать master.destroy
вместо frame.quit
того, чтобы останавливать программу tkinter
import time import tkinter as tk # PEP8: `import *` is not preferred import pyautogui class App: def __init__(self, master, task): frame = tk.Frame(master) frame.pack() self.button = tk.Button(frame, text="QUIT", fg="red", command=master.destroy) self.button.pack(side='left') frame.after(100, task, 1) def task(i): myScreenshot = pyautogui.screenshot() myScreenshot.save(r"C:UserselsinDesktoppythonnameTask" str(i) ".png") i = 1 root.after(2000, task, i) root = tk.Tk() app = App(root, task) root.mainloop()