尝试了很多东西,现在终于解决了。
基本上,我想做的是从 GUI 获取两个输入,然后使用这两个参数调用一个函数(来自另一个 python 程序),然后一旦处理完成,然后从 GUI 用户那里观看或下载该内容,按分别观看或下载按钮。
为此,我早些时候从那个调用函数的线程返回了监视和下载链接,甚至在另一个线程上调用该函数,因为它是执行后返回的值,所以 GUI 冻结并显示 没有响应
然后在尝试了很多事情之后,我遇到了守护进程,所以我只创建了那个线程 daemon 并解决了冻结的主要问题,但现在我无法获取返回值(当我尝试获取返回值,它再次开始冻结 GUI)
然后我找到了从主线程访问这些链接的替代方法。
这里的重点是,如果函数不返回线程中正在调用的任何内容,那么只需将其设为守护进程 thread_name.daemon() = True,现在它不会冻结 GUI
现在,如果您想在 线程完成之后执行某些操作,则可以使用 thread_name.is_alive()
我的代码看起来像这样:-
from selenium_l_headless import movie_bot
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.properties import ObjectProperty
from selenium_l_headless import *
import threading
import time
from kivy.clock import Clock
class MovieBot(MDApp):
mname = ObjectProperty(None)
quality = ObjectProperty(None)
Quality = ObjectProperty(None)
link4 = ObjectProperty(None)
link5 = ObjectProperty(None)
checks = []
def build(self):
self.theme_cls.theme_style= "Dark"
self.theme_cls.primary_palette = "Teal"
return Builder.load_file('kivy_bot_md.kv')
def checkBox_click(self, instance, value, Q):
global Quality
if value==True:
MovieBot.checks.append(Q)
Quality=''
for x in MovieBot.checks:
Quality = f'{Quality}{x}'
else:
MovieBot.checks.remove(Q)
Quality = ''
for x in MovieBot.checks:
Quality = f'{Quality} {x}'
def complete(self):
self.root.ids.status.text = 'Searching completed, Now you can
download or watch the movie!'
global flag
flag=0
def status_sleep(self, *args):
try:
self.root.ids.status.text = 'Searching, please wait...'
if(t1.is_alive() is False):
self.complete()
except:
pass
def search_button(self):
try:
mname = self.root.ids.name.text
quality = Quality
global link4,link5
global t1, flag
flag=1
t1 = threading.Thread(target = movie_bot, args= [mname, quality])
t1.daemon = True
t1.start()
if(t1.is_alive()):
Clock.schedule_interval(self.status_sleep,1)
except:
pass
def watch(self):
try:
if(flag is 1):
pass
else:
self.root.ids.status.text = ''
t2 = threading.Thread(target=watch_now)
t2.daemon = True
t2.start()
except:
pass
def download(self):
try:
if(flag is 1):
pass
else:
self.root.ids.status.text = ''
t3 = threading.Thread(target=download_movie)
t3.daemon = True
t3.start()
except:
pass
def close(self):
exit(0)
MovieBot().run()