2016-04-28 2 views
0

Я работаю над добавлением физической кнопки GPIO к базовому графическому интерфейсу Tkinter, который я разрабатывал.Tkinter и GPIO.add_event_detect - TypeError?

(код графического интерфейса основан на следующем примере: http://pythonprogramming.net/change-show-new-frame-tkinter/)

На основе предложений, сделанных здесь, я добавил функцию кнопки GPIO под названием «check_for_button_press», и он использует GPIO.add_event_detect и .after

Я подкорректировали его, но я продолжаю в конечном итоге с этой ошибкой:

TypeError: check_for_button_press() takes exactly 1 argument (2 given)

Там, очевидно, что-то основное, что я пропускаю, может кто-нибудь помочь мне определить, что это такое? Благодаря!

Вот код с новой функцией прокомментировал:

import Tkinter as tk 
import time 
import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BCM) 
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
GPIO.add_event_detect(5, GPIO.RISING) 

class SampleApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.attributes('-fullscreen', True) 
     self.config(cursor="none") 

     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=0) 
     container.grid_columnconfigure(0, weight=0) 

     self.frames = {} 
     for F in (StartPage, PageOne): 
      page_name = F.__name__ 
      frame = F(container, self) 
      self.frames[page_name] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 


    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

    def check_for_button_press(self):    #######check_for_button_press 
     if GPIO.event_detected(5):     #######GPIO 
      self.show_frame(page_name)    ####### 
     self.after(10, self.check_for_button_press) ####### 



class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 

     photonav1 = tk.PhotoImage(file="nav1.gif") 
     photonav2 = tk.PhotoImage(file="nav2.gif") 
     photonav3 = tk.PhotoImage(file="nav3.gif") 
     photonav4 = tk.PhotoImage(file="nav4.gif") 
     photonav5 = tk.PhotoImage(file="nav5.gif") 
     photonav6 = tk.PhotoImage(file="nav6.gif") 
     photosub1 = tk.PhotoImage(file="navmain1.gif") 


     buttonnav1 = tk.Button(self, image=photonav1, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, 
          command=lambda: controller.show_frame("PageOne")) 

     buttonnav2 = tk.Button(self, image=photonav2, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageTwo")) 

     buttonnav3 = tk.Button(self, image=photonav3, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageThree")) 

     buttonnav4 = tk.Button(self, image=photonav4, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageFour")) 

     buttonnav5 = tk.Button(self, image=photonav5, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageFive")) 

     buttonnav6 = tk.Button(self, image=photonav6, width=158, height=38, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageSix")) 

     buttonsub1 = tk.Button(self, image=photosub1, width=158, height=238, 
    text="", bg='green', bd=0, highlightthickness=0, activebackground="green", 
          command=lambda: controller.show_frame("PageSix")) 



     buttonsub1.pack(side=tk.RIGHT, fill=tk.Y, padx=0, pady=0) 
     buttonsub1.image = photosub1   

     buttonnav1.pack() 
     buttonnav1.image = photonav1 

     buttonnav2.pack() 
     buttonnav2.image = photonav2 

     buttonnav3.pack() 
     buttonnav3.image = photonav3 

     buttonnav4.pack() 
     buttonnav4.image = photonav4 

     buttonnav5.pack() 
     buttonnav5.image = photonav5 

     buttonnav6.pack() 
     buttonnav6.image = photonav6   


class PageOne(tk.Frame): 

# .... 
# ... 
# ... truncated 
# .. 
# . 



if __name__ == "__main__": 
    app = SampleApp() 
    app.after(0, app.check_for_button_press, app) 
    app.mainloop() 
+0

Не будет 'self.after (10, self.check_for_button_press)' in 'def check_for_button_press (self):' создать бесконечную рекурсию? Если ваша программа вызывает исключение через 2 часа и 46 минут, вот почему (предел глубины рекурсии по умолчанию для python равен 1000, и вы, кажется, ожидаете 10 секунд каждый раз, когда функция запускается так ...) – jDo

+0

Спасибо, я проверю это , Новое для использования метода after – naturesrat

+0

Я имел в виду, почему вы это делаете? Нужно ли это называть себя? Я ничего не знаю о tkinter, но это кажется странным. Вы пытались удалить 'self.after (10, self.check_for_button_press)'? Любое изменение? – jDo

ответ

1

Почему вы называете check_for_button_press, как это изначально?

app.after(0, app.check_for_button_press, app) 

Вы должны просто позвонить

app.check_for_button_press() 

и после того, как внутри check_for_button_press будет обрабатывать непрерывно проверять путем не используя после метода нет необходимости использовать после того, как здесь дважды.

Глядя на after method вы можете передать:

after(delay_ms, callback, *args) 

Таким образом, вы действительно проходит два аргумента.

+0

ах да, теперь он работает, спасибо! – naturesrat