2016-08-28 6 views
0

Я хочу переключить кнопку и показать ее изменения на ярлыке с помощью tkinter.Я хочу переключить настоящую кнопочку и отобразить ее на tkinter GUI

Если я нажимаю на кнопку она показывает «на» на этикетке, и когда я нажимаю снова показывает «OFF» на этикетке

Так что я стараюсь эти коды и если я пытаюсь неправильный код, пожалуйста, помогите я пишу правильно, используя tkinter.

У меня есть проблема в комбинируя этот код

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(22,GPIO.IN,up_down=GPIO.PUD_UP) 

while(1): 
    if GPIO.input(22)==1: 
     if bs == False : 
      x.set("on") 
      bs=True 
      sleep(0.5) 
     else: 
      x.set("off") 
      bs=False 
      sleep(0.5) 

Это работает хорошо, но я хочу, чтобы подключить его к метке GUI для печати на нем включен или выключен.

Вот код Tkinter

import tkinter.* 

root = tk() 
x = StringVar() 

s=Label(root,textvariable=x) 

s.grid(column=0,row=0) 

root.mainloop() 

Когда я пытаюсь совместить это я сделать это как этот

from Tkinter import * 
import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7,GPIO.IN) 

b=False 
def check_button1(): 
    if GPIO.input(7)== 1: 
     if b == False : 
      labelText1.set("on") 
      print"on" 
      b=True 
      time.sleep(0.5) 
     else: 
      labelText1.set("off") 
      print"off" 
      b=False 
      time.sleep(0.5) 

    mamdouh.after(10,check_button1) 

mamdouh = Tk() 
labelText1 = StringVar() 

x1 = Label(mamdouh,textvariable=labelText1) 
x1.config(font=('Helvetica',25,'bold')) 
x1.grid(row=0,column=0) 

mamdouh.title("mamdouh") 
mamdouh.geometry('1200x700') 
mamdouh.after(10,check_button1) 
mamdouh.mainloop() 

, но это не работает он держит пустой каждый раз, когда я нажимаю на кнопку на самом деле Если он хорошо работает, я поставлю 17 кнопку

Я думаю, что проблема заключается в том, чтобы разместить это, если статут в нужном месте и поместить переменную b в нужное место, и я думаю, что als о есть проблема между этим, если Постулаты и Tkinter, потому что я попробовал этот код которым работает идеально, но это не переключая кнопки, поэтому я хочу, чтобы изменить это позволяет добавить этот код здесь также:

from Tkinter import * 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7,GPIO.IN) 

def check_button1(): 
    if(GPIO.input(7) == GPIO.LOW): 
     labelText1.set("on") 
    else: 
     labelText1.set("off") 
    mamdouh.after(10,check_button1) 

mamdouh = Tk() 
labelText1 = StringVar() 

x1 = Label(mamdouh,textvariable=labelText1) 
x1.config(font=('Helvetica',25,'bold')) 
x1.grid(row=0,column=0) 

mamdouh.title("mamdouh") 
mamdouh.geometry('1200x700') 
mamdouh.after(10,check_button1) 
mamdouh.mainloop() 

Так как я может сделать эту кнопку переключения на ярлыке?

+0

ли вы решить эту проблему? У меня может быть ответ. – martineau

+0

Я не нашел никакого решения. Надеюсь, вы дадите мне ответ –

+0

ОК. Это займет некоторое время, я сейчас работаю над чем-то другим. – martineau

ответ

0

Ваша проблема заключается в распознавании кнопок и кнопок событий. Драйвер мыши вашей операционной системы делает это для ваших кнопок мыши. Если ваш GPIO-модуль не сделает это за вас, вам придется обнаружить эти события, сравнив текущее состояние с предыдущим состоянием. (Я игнорирую здесь любую возможную необходимость «де-отскока» кнопки.) Вы пытаетесь сделать это с помощью вызовов time.sleep (.5), но не используйте time.sleep в gui-коде.

Ваш водитель должен быть автономным и независимым от любых виджетов tk, кроме корня, необходимого для .after. Для нескольких кнопок вам понадобится собственный класс GPIOButton. Ваш код, который работает, является отправной точкой. Tkinter позволяет привязать команду к событиям с кнопками. Ваш класс init также должен принимать и/или принимать команды события (обратные вызовы).

Вот что-то непроверенное, которое может вас заинтересовать.

class GPIOButton: 
    def __init__(self, master, buttons, command_down=None, command_up=None): 
     self.master = master 
     self.buttons = buttons 
     self.command_down = command_down 
     self.command_up = command_up 
     GPIO.setmode(GPIO.BOARD) 
     for button in buttons: 
      GPIO.setup(button, GPIO.IN) 
     self.state = [GPIO.HIGH] * len(buttons) # best initial value? 
     self.check_buttons() # or call this elsewhere 
    def check_buttons(self): 
     for i, button in enumerate(self.buttons): 
      oldstate = self.state[i] 
      newstate = GPIO.input(button) 
      if oldstate != newstate: 
       self.state[i] = newstate 
       command = (self.command_down if newstate==GPIO.LOW 
          else self.command_up) 
       command(button) 
     self.master.after(10, self.check_button) 
+0

На самом деле, я понимаю 60% вашего ответа, потому что у меня нет опыта работы на python, но я использую его в своем проекте, так что вы можете сказать мне, как я буду использовать этот код –

+0

... can вы объясните, как я буду использовать этот код, пожалуйста, –

+0

Я думаю о редактировании. –

0

Позвольте мне предварить мой ответ с отказом, я не имею Raspberry Pi, поэтому не может проверить это работает с реальной вещью. Для тестирования я использовал прокси-класс, который имитирует случайное нажатие кнопки. Возможно, вам придется настроить значение DELAY в зависимости от того, насколько быстро работает интерфейс GPIO.

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

try: 
    import Tkinter as tk 
    import tkFont 
except ImportError: # Python 3 
    import tkinter as tk 
    import tkinter.font as tkFont 

#import RPi.GPIO as GPIO 
# 
#GPIO.setmode(GPIO.BOARD) 
# 
#class GPIOButton(object): 
# """ Encapsulates GPIO button interface. """ 
# def __init__(self, pin): 
#  self.pin = pin 
#  self.status = 0 
#  GPIO.setup(pin, GPIO.IN) 
# 
# def update_status(self): 
#  self.status = GPIO.input(pin) == GPIO.LOW 

### Proxy class since I don't have a Rasperry Pi. ### 
import random 

class GPIOButton(object): 
    def __init__(self, pin): 
     self.pin = pin 
     self.status = 0 

    def update_status(self): 
     if not random.randint(0, 99) % 20: # occassionally toggle status 
      self.status = not self.status 

class App(tk.Frame): 
    STRIDE = 8 
    DELAY = 100 # delay in millsecs between button status updates 

    def __init__(self, gpio_buttons, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.gpio_buttons = gpio_buttons 
     self.create_widgets() 
     self.after(self.DELAY, self.update_buttons, self.DELAY) # start updates 

    def create_widgets(self): 
     self.btn_font = tkFont.Font(family="Helvetica", size=12, weight='bold') 
     self.gui_buttons = [] 
     for i, button in enumerate(self.gpio_buttons): 
      is_pressed = tk.BooleanVar() 
      is_pressed.set(False) 
      radiobutton = tk.Radiobutton(self, 
             text=format(i+1, '02d'), 
             font=self.btn_font, 
             value=True, 
             variable=is_pressed, 
             relief=tk.RIDGE) 
      row, col = divmod(i, self.STRIDE) 
      radiobutton.grid(column=col, row=row) 
      self.gui_buttons.append(is_pressed) 

    def update_buttons(self, delay): 
     for i, gpio_button in enumerate(self.gpio_buttons): 
      previous_status = gpio_button.status 
      gpio_button.update_status() 
      if gpio_button.status != previous_status: 
       self.gui_buttons[i].set(gpio_button.status) 

     self.after(delay, self.update_buttons, delay) # rinse and repeat 


gpio_buttons = [GPIOButton(pin) for pin in range(16)] 
app = App(gpio_buttons) 
app.master.title('Rasberry Pi Buttons') 
app.mainloop() 

Вот что моделирование выглядит работает на моем компьютере с Windows:

screenshot of display showing the status of all sixteen buttons

+0

mamdouh: У вас была возможность попробовать это еще? – martineau

 Смежные вопросы

  • Нет связанных вопросов^_^