2017-03-13 1 views
1

나는 Tkinter GUI를 사용하여 Raspberry Pi로 실행하는 앱을 만들고 있습니다. 앱이 이미 잘 돌아갑니다. 이제 GPIOS에 ​​연결된 2 개의 물리적 버튼을 사용하여 앱에있는 버튼 위젯 중 두 가지와 상호 작용합니다. 포럼의 도우미 덕분에 코드에서 볼 수있는 것처럼 할 수있는 방법을 발견했습니다. 하지만 이제 위젯을 easly 할 수 있기 때문에 우연히 푸시하는 것을 피하기 위해 물리적 버튼을 어떤 식 으로든 비활성화해야합니다. 나는 많은 것을 인터넷 검색을하고 있었지만 나는 필요한 것을 발견하지 못했다. 어떤 사람이 이것을 얻기위한 방법에 대한 방향을 알려줄 수 있습니까? 미리 감사드립니다.tkinter 버튼 위젯과 상호 작용하는 물리적 버튼

from Tkinter import * 
import RPi.GPIO as GPIO 
root = Tk() 
root.geometry("320x480") 
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM) 

GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP) 

shootdelay = 12 #12 
shootinterval = 7#7 
shootnumber = 5#12 
videodelay = 3 
selft = 5 
newset = 0 
endvideo = 5 
intertext = "(D:" + str(shootdelay) + ")(I:" + str(shootinterval) + ")(T:" + str(shootnumber) + ")" 

flagselftim = 0 
flagvideo = 0 
videosetmode = 0 
flagsetings = 0 
flagcancel = 0 
flagnewset = 0 
secDelay = shootdelay 
secInterv = shootinterval 
secSelftim = selft 
secvideo = videodelay 
remainshots = shootnumber 
secshoots = shootnumber - 1 
seccompte = 0 
readyshoots = 


class intervalometer: 

def __init__(self, master): 

    self.textBox = Text(root, height=1, width=1, relief=SUNKEN, font=('arial narrow', 17, 'normal'), bg="green", 
         fg="white") 
    self.textBox.grid(row=1, column=1, padx=3, pady=2, sticky=NSEW) 
    self.textBox.insert(END, "READY") 

    self.botshoot = Button(root, width=18, font=('arial narrow', 19, 'normal'), text="START", 
          activebackground="#00dfdf") 
    self.botshoot.grid(row=4, rowspan=2, column=0, columnspan=2, ipady=15, pady=2, sticky=NSEW) 
    self.botshoot.configure(command=self.start) 



    self.botStop = Button(root, heigh=2, font=('arial', 18, 'normal'), text="STOP/RESET", activebackground="red") 
    self.botStop.grid(row=13, rowspan=3, column=0, pady=1, sticky=NSEW) 
    self.botStop.configure(state=DISABLED, command=self.stop) 

    self.botQuit = Button(root, width=3, font=('arial', 18, 'normal'), text="QUIT", activebackground="red", 
          state=NORMAL) 
    self.botQuit.grid(row=13, rowspan=3, column=1, pady=1, sticky=NSEW) 
    self.botQuit.configure(command=self.closewindow) 



    GPIO.add_event_detect(18, GPIO.RISING, callback=self.start, bouncetime=200) 


def start(self, *args, **kwargs): 
    global flagselftim 

    self.count = 0 
    self.cancel_id = None 
    self.botshoot.configure(state=DISABLED) 

    self.botStop.configure(state=NORMAL) 
    self.botQuit.configure(state=DISABLED) 


    self.start_shoot_delay() 



def stop(self): 
    global secDelay 
    global secSelftim 
    global selft 
    global flagvideo 
    global videosetmode 
    global secvideo 
    global remainshots 
    global secInterv 
    global readyshoots 
    flagvideo = 0 
    videosetmode = 0 
    secDelay = shootdelay 
    secInterv = shootinterval 
    secvideo = videodelay 
    selft = 5 
    secSelftim = selft 
    remainshots = shootnumber 
    readyshoots = 1 
    if self.cancel_id is not None: 
     self.textBox.after_cancel(self.cancel_id) 
     self.cancel_id = None 
     self.textBox.insert(END, 0) 
     self.textBox.delete("1.0", END) 
     self.botshoot.configure(text="START") 
     self.botshoot.configure(state=NORMAL) 

     self.botStop.configure(state=DISABLED) 
     self.botQuit.configure(state=NORMAL) 

     self.textBox.insert(END, "READY") 
     self.textBox.configure(font=('arial narrow', 17, 'normal'), bg="green", fg="white") 



def closewindow(self): 
    root.destroy() 

def start_shoot_delay(self): 
    global secDelay 

    if secDelay > 9: 
     contador = " " + str(secDelay) 
    else: 
     contador = " " + str(secDelay) 

    self.textBox.delete("1.0", END) 
    self.textBox.configure(font=('arial narrow', 17, 'normal'), bg="red", fg="white") 
    self.botshoot.configure(state=DISABLED) 
    if self.count < shootdelay: 
     self.count += 1 
     self.textBox.insert(END, contador) 
     self.cancel_id = self.textBox.after(1000, self.start_shoot_delay) 
     secDelay -= 1 
    else: 
     self.count = 0 
     secDelay = shootdelay 
     self.start_shoot_interval() 


def start_shoot_interval(self): 
    global secInterv 
    if remainshots == shootnumber: 
     self.start_shootings() 
    else: 
     if secInterv > 9: 
      contador = " " + str(secInterv) 
     else: 
      contador = " " + str(secInterv) 

     self.textBox.delete("1.0", END) 
     self.textBox.configure(font=('arial narrow', 17, 'normal'), bg="red", fg="white") 

     if self.count < shootinterval: 
      self.count += 1 
      self.textBox.insert(END, contador) 
      self.cancel_id = self.textBox.after(1000, self.start_shoot_interval) 
      secInterv -= 1 
     else: 
      self.count = 0 
      secInterv = shootinterval 
      self.start_shootings() 


def start_shootings(self): 
    global remainshots 
    global videosetmode 
    global readyshoots 
    global secSelftim 
    global selft 
    remainshots -=1 
    if secSelftim <5: 
     txtremain = "SHOOTING = " + str(1) + "/" + str(1) 
    else: 
     txtremain = "REMAINING = " + str(remainshots) + "/" + str(shootnumber) 

    print "BEEP shoot nr",readyshoots, "av", shootnumber 


    readyshoots +=1 
    if remainshots >0: 
     self.start_shoot_interval() 
    else: 
     print "BEEP-BEEP-BEEP : end of roll" 
     self.etstatus.configure(text="END OF ROLL") 
     root.update_idletasks() 
     root.after(500) 
     readyshoots = 1 
     selft = 5 
     self.textBox.insert(END, "READY") 
     self.textBox.configure(font=('arial narrow', 17, 'normal'), bg="green", fg="white") 
     self.botshoot.configure(state=NORMAL) 
     self.botStop.configure(state=DISABLED) 
     self.botQuit.configure(state=NORMAL) 
     remainshots = shootnumber 

intervalometer(root) 
root.mainloop() 

답변

0

시작 메소드가 버튼의 입력을 포함하여 전체 프로그램을 잠그기 때문에이 문제가 어떻게 발생하는지는 알 수 없습니다. 버튼 감지가 자신의 스레드 또는 뭔가에 있다면, 당신은 수표를 추가 할 수 있습니다. 확인하는 가장 쉬운 방법은 tk 버튼 상태입니다.

def start(self, *args, **kwargs): 
    if self.botshoot['state'] == DISABLED: 
     print 'already running' 
     return # abort this method 
    self.botshoot.configure(state=DISABLED) 
    # etc ... 
+0

감사합니다. Jonathan, 네가 맞습니다. 실제 버튼을 테스트하는 데 사용하는 예를 보내 드리겠습니다. 문제는 제가 작성한 전체 스크립트에 나타납니다. 기능이 실행 중일 때 다시 버튼을 누르면 버튼이 항상 활성화되므로 잘못된 일을하기 위해 스크립트가 시작됩니다. 나는 지금 전체 스크립트를 넣어 – josepraspi

+0

미안하지만, 스크립트를 게시하고 싶지만 할 수 없다 ... 다시 시작하려고 노력할 것이다. 감사합니다 – josepraspi

+0

내 질문을 편집하고 전체 스크립트를 넣으십시오. start_shoot_delay 함수가 실행될 때 볼 수 있듯이 연속적으로 스크립트를 저장하고 모든 값을 넣는 botStop 버튼 위젯의 이벤트를 찾고 있습니다. 그래서 우발적 인 물리적 버튼을 감지 할 수 있습니다. 이것이 기능이 끝날 때까지이 물리적 버튼을 비활성화하려는 이유입니다. – josepraspi