鱼C论坛

 找回密码
 立即注册
查看: 4026|回复: 10

[技术交流] python,多进程,图像界面(UI)

[复制链接]
发表于 2017-7-5 17:57:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
多进程,图像界面(UI)

看注释吧,程序很简单,就不罗嗦了~

  1. import tkinter as tk
  2. import multiprocessing as mp

  3. def proc(que,n):
  4.     que.put('proc %d' % n)

  5. def cmd():
  6.     global cnt
  7.     cnt += 1
  8.     p = mp.Process(target=proc, args=(q,cnt))
  9.     p.start()
  10.     p.join()

  11. ## windows系统必须在 main 下运行
  12. if __name__=='__main__':
  13.    
  14.     cnt = 0
  15.     q = mp.Queue() #进程间通信
  16.    
  17.     root = tk.Tk() # 界面在 main 中生成,否则会重复。
  18.     tk.Button(root,text='--点几下呗--',command=cmd).pack()
  19.     root.mainloop()

  20.     # 关闭界面后,会执行下面的语句
  21.     print('点了 %d 次哦~' % q.qsize())
  22.     while not q.empty():
  23.         print(q.get())
  24.         
  25.     print('end')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-5 18:57:36 | 显示全部楼层
看注释吧,程序很简单,就不罗嗦了~

我能说点了几下,什么东西都没有么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-5 19:31:23 | 显示全部楼层
~风介~ 发表于 2017-7-5 18:57
我能说点了几下,什么东西都没有么?

没有  就对了啊~

不会写的同学,每点一下,就多一个界面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 18:02:41 | 显示全部楼层
如果在proc里加一个比较长处理的任务呢,用sleep(100)模拟。点击后就回一直卡住了。
我希望我点击一次就开始proc,但是在sleep时间结束前再点按键就不能生效,怎么办呢?
我现在是给了一个cfg里边有个标志位,第一次点击后写这个为true,函数中判断为true就直接退出
执行完设置为flase,感觉很土
def proc(que, n):
        que.put('proc %d' % n)
        sleep(100)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-6 18:42:25 | 显示全部楼层
jf050108 发表于 2017-7-6 18:02
如果在proc里加一个比较长处理的任务呢,用sleep(100)模拟。点击后就回一直卡住了。
我希望我点击一次就 ...

把 cmd() 里的 p.join()  注释掉,主程序就不会等待 子进程结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 18:50:44 | 显示全部楼层
SixPy 发表于 2017-7-6 18:42
把 cmd() 里的 p.join()  注释掉,主程序就不会等待 子进程结束了

是的,这样不会等待。
可是点击按键还是会起新的进程,如果想再点击第一次后按键就不能点击了,或者点击了也无效,不是卡死的状态。这个怎么做呢,等第一次点击的进程结束后,按键又能恢复点击功能,或者点击有效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-6 18:59:12 | 显示全部楼层
jf050108 发表于 2017-7-6 18:50
是的,这样不会等待。
可是点击按键还是会起新的进程,如果想再点击第一次后按键就不能点击了,或者点击 ...


那你不是废话嘛~
既要不等待,又要没有新进程,
那还要多进程干吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 19:26:05 | 显示全部楼层
如果我点击后是在处理一个文件,再次点击的话这个文件已经在处理了,第二个进程就不能打开这个文件会报错啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 19:27:35 | 显示全部楼层
SixPy 发表于 2017-7-6 18:59
那你不是废话嘛~
既要不等待,又要没有新进程,
那还要多进程干吗?

如果我点击后是在处理一个文件,而且耗时比较久。再次点击的话这个文件已经在处理了,第二个进程就不能操作这个文件了,当然要阻止啊。但是有不能让界面卡死
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 12:57:45 | 显示全部楼层
jf050108 发表于 2017-7-6 19:27
如果我点击后是在处理一个文件,而且耗时比较久。再次点击的话这个文件已经在处理了,第二个进程就不能操 ...

改了点
自己学习吧~

  1. import tkinter as tk
  2. import multiprocessing as mp
  3. import time

  4. def proc(que,n):
  5.     que.put('proc %d' % n)
  6.     time.sleep(5) # 模拟耗时过程
  7.     que.get()
  8.    

  9. def cmd():
  10.     global cnt
  11.     if not q.full():
  12.         cnt += 1
  13.         p = mp.Process(target=proc, args=(q,cnt))
  14.         p.daemon = True
  15.         p.start()
  16.         #p.join()
  17.         tk.messagebox.showinfo('子进程','子进程已经启动!')
  18.     else:
  19.         tk.messagebox.showwarning('- 提示 -','子进程正在运行……')

  20. ## windows系统必须在 main 下运行
  21. if __name__=='__main__':
  22.    
  23.     cnt = 0
  24.     q = mp.Queue(1)
  25.    
  26.     root = tk.Tk() # 界面在 main 中生成,否则会重复。
  27.     tk.Button(root,text='--点几下呗--',command=cmd).pack()
  28.     root.mainloop()

  29.     # 关闭界面后,会执行下面的语句
  30.     print('点了 %d 次哦~' % q.qsize())
  31.     while not q.empty():
  32.         print(q.get())
  33.         
  34.     print('end')
  35.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 10:31:30 | 显示全部楼层
多谢,我试试看~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表