2017-12-12 18 views
1

아래 내 테스트 코드에 봐 주시기 바랍니다 클릭하여 문자를 구분합니다 :Python3 GTK3는 변경 버튼 직후

import time 
import subprocess 
import os,re 
import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self, title="test") 
     self.set_default_size(400, 190) 
     self.set_border_width(10) 
     fixed = Gtk.Fixed() 
     self.add(fixed) 

     self.button2 = Gtk.Button(label='press') 
     self.button2.connect("clicked", self.aaabbb) 
     self.button2.set_size_request(100, 20) 
     fixed.put(self.button2, 170, 10) 

    def aaabbb(self,widget): 
     self.button2.set_sensitive(False) 
     p = subprocess.run(['/bin/bash','-c', '/bin/sleep 5']) 
     print(p.returncode) 

window = MyWindow() 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main() 

당신은 당신이 그 버튼을 통지합니다이 간단한 응용 프로그램 서브 프로세스 후 5 초 후에 비활성화됩니다를 실행하는 경우 "sleep 5"완료

질문 - 하위 프로세스를 시작하기 전에 단추를 구분하지 않도록 설정하는 방법?

는 서브 프로세스 호출이 비동기하지 않고 블록 때문에 발생 사전

답변

1

당신을 감사합니다 주회 돌이와 결과로 사용자 인터페이스를 제공합니다.

따라서 접근 방식이 올바르지 않습니다.

클릭 신호에는 버튼을 눌렀다가 놓아야하지만 사용할 수있는 다른 신호가 있습니다. button-press-eventbutton-release-event. 콜백 프로토 타입은 clicked과 다를 수 있으며 필요한 경우 해당 이벤트에 액세스 할 수 있습니다.

귀하의 질문에 대한 대답은 단추 누르기 이벤트에 대한 콜백을 설정하는 것이지만 문제가 해결되지는 않습니다! 호출은 비동기 적이어야하며 GLib spawn async method을 사용할 수 있도록 구현해야합니다.

+0

"다중 처리"를 사용할 수 있습니까 – user1078796

+0

아마도 서브 프로세스에서 gtk 메소드를 호출하지 않으면 아무런 문제가 없을 것입니다. 메인 루프와 통신하고 싶을 때 스트레스가 발생할 것입니다. 파이프는 문제가 있습니다 : "두 프로세스 (또는 스레드)가 동시에 파이프의 동일한 끝에서 읽거나 쓰려고하면 파이프의 데이터가 손상 될 수 있습니다."큐는 "스레드 및 프로세스 안전성이있는 것 같습니다 "비동기 호출이어야 함을 잊지 마십시오. 어쨌든, 당신이 문제를 격리시킬 것을 제안합니다. 멀티 프로세싱을 사용해야하는 구체적인 이유가 없다면 GLib trhreads/thread pools와 async queues를 시도해보십시오. –