Кнопка Tkinter не появляется, извините, ребята, я знаю, что нить уже существует

#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()