python用pyqt5为程序添加GUI后功能和界面只能二选一运行

Duriea 发布于 2019/01/16 13:37
阅读 1K+
收藏 0

正在直播: LF AI 基金会主办首届AICON 2022>>>

情况是这样的,最近我为我的python程序添加一个GUI,整合到一起的时候点解button运行程序功能代码的时候却失去响应了。

 因为我没有注释代码中的print,因此可以看到功能能正常运行,但是界面却失去响应了。

后来意识到应该是线程的问题,然后尝试了使用

threading模块甚至
multiprocessing模块来尝试都解决不了

这是涉及到线程或进程的问题?如果是为什么我尝试将功能当代码的调用封装到一个函数中传到threading中开启新线程却依然解决不了。

请问大神们都是怎么解决GUI应用程序的线程问题的

加载中
0
mr_chip
mr_chip
贴个button的slot代码
0
Duriea
Duriea

引用来自“mr_chip”的评论

贴个button的slot代码
self.pushButton = QtWidgets.QPushButton(self.tab)
self.pushButton.setGeometry(QtCore.QRect(10, 120, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.run)

 

def starting(self):
    # pass
    read = HBTiaoShi.readCSV()
    read.implementor()
    read.getInfo()
    # time1 = HBTiaoShi.time.time()
    HBTiaoShi.log.initLogConf()
    HBTiaoShi.log = HBTiaoShi.logging.getLogger('')
    read.openfile("..")
    HBTiaoShi.time.sleep(10)
def startingflow(self):
    observer = HBTiaoShi.Observer()
    event_handler = HBTiaoShi.FileEventHandler()
    observer.schedule(event_handler, "..", True)
    observer.start()
    try:
        while True:
            HBTiaoShi.time.sleep(600)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

def run(self):
    p=Process(target=self.starting)
    p.start()
    self.startingflow()

因为我的功能之前都是封装到类中,实例化调用运行的。然后我给它添加GUI后我就不知道要怎么调用。因为我是尽量的一键自动运行,又因为我是一个大整体将每个环节做成了一个function。

Duriea
Duriea
回复 @mr_chip :感谢,我已经解决了阻塞了。然后我剩余最后的一点疑惑就是,我将原先在控制台print的内容打印在文本框中,结果发现GUI不一会就自己退出了。难道文本框还有内容溢出的坑的么?像我们平时的exe安装包 那么多信息在文本框打印出来也不会说崩掉什么的。请问您知道这是什么原因么?
mr_chip
mr_chip
回复 @Duriea : 开一个监控目录的线程,然后用signal和slot来和UI交互
Duriea
Duriea
回复 @mr_chip : 但是我仍然需要点击按钮运行完功能后自动进入目录监控,等有新增的文件 程序继续重复点击按钮时候的功能
Duriea
Duriea
回复 @mr_chip : 奇迹....我重打开pycharm就可以了
Duriea
Duriea
回复 @mr_chip : 但是,我现在将看门狗的代码注释后,单纯测试自己写的逻辑功能和GUI共存也不能实现
下一页
0
Duriea
Duriea

引用来自“mr_chip”的评论

贴个button的slot代码
def startingflow(self):
    observer = HBTiaoShi.Observer()
    event_handler = HBTiaoShi.FileEventHandler()
    observer.schedule(event_handler, "..", True)
    observer.start()

但是我 根据文档的observer.start()感觉他就是已经开了一条新线程了。

try:
#         while True:
#             HBTiaoShi.time.sleep(600)
#     except KeyboardInterrupt:
#         observer.stop()
#     observer.join()

其实我不是很理解他的含义,目前我只知道他是做定时多少时间扫一遍目录。然后join保持看门狗运行,这段代码删去会不会就不阻塞了,但是会不会也导致看门狗监控不生效

Duriea
Duriea
回复 @mr_chip : 不过仔细想一想 这个while应该是用来无限循环休眠看门狗的,设定一个时间让他隔一定时间监控一下目录变化。但是我现在的问题就是找出来了。需要解决这个阻塞了GUI
Duriea
Duriea
回复 @mr_chip : 好似是没用,但是那个join貌似是必须要有的,因为我注释掉后代码运行成功后就退出来了
mr_chip
mr_chip
这个要看他的实现,我觉得那个while没用
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部