Проблема с переменной для оператора if в tkinter - PullRequest
0 голосов
/ 14 января 2019

Привет всем, у меня проблема с моим скриптом, потому что когда я запускаю его для тестирования и нажимаю кнопку L0, я получаю это сообщение об ошибке:

Исключение в обратном вызове Tkinter Traceback (последний вызов был последним): Файл "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/init.py", строка 1705, в вызов вернуть self.func (* аргументы) Файл "nucleo.py", строка 33, в формате spegni value = int (previous_state.get ()) UnboundLocalError: локальная переменная «previous_state», на которую ссылается перед присваиванием

Я показываю свой полный код:

import serial

import random

import time

from tkinter import *

from tkinter import messagebox

import os

previuos_state=0

def accendi():
  if previous_state == 0:
    TimeDelay = random.randrange(10,20)
    time.sleep(TimeDelay)

    ser.write('L1'.encode())

    previous_state = 1

    USER_TIME = list(ser.read(5).decode("utf8"))

    if USER_TIME[0] == 'T':


        USER_TIME = str(USER_TIME[1])+str(USER_TIME[2])+str(USER_TIME[3])+str(USER_TIME[4])

        print(str(int(USER_TIME,16))+" ms")

    else:

        print("Errore in ricezione")
  else:
    messagebox.showwarning("Attenzione", "Spegnere led per iniziare un nuovo test")
def spegni():

  if previous_state == 1:
    TimeDelay = random.randrange(10,20)
    time.sleep(TimeDelay)

    ser.write('L0'.encode())

    previous_state = 0

    USER_TIME = list(ser.read(5).decode("utf8"))

    if USER_TIME[0] == 'T':

        USER_TIME = str(USER_TIME[1])+str(USER_TIME[2])+str(USER_TIME[3])+str(USER_TIME[4])

        print(str(int(USER_TIME,16))+" ms")


    else:

        print("Errore in ricezione")

else:
    messagebox.showwarning("Attenzione", "Accendere led per iniziare un nuovo test")


finestra=Tk()
finestra.geometry("520x230")
finestra.title("Misuratore di riflessi")
testo=Label(finestra, text="Premere il pulsante L0 se il LED è acceso\nPremere il pulsante L1 se il LED è spento\nPremere  EXIT per uscire")
testo.grid(row=0, column=0, columnspan=3)
tasto1=Button(finestra, text="L0", command=spegni)
tasto1.grid(row=3, column=0)
tasto2=Button(finestra, text="L1", command=accendi)
tasto2.grid(row=3, column=2)
lista=Listbox(finestra)
lista.insert(END, "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto")
lista.grid(row=0, column= 3, columnspan=5, rowspan=5)
tasto3=Button(finestra, text="EXIT", command=exit)
tasto3.grid(row=4, column=1)

finestra.mainloop()

Я не понимаю, почему я не могу использовать переменную "previuous_state" в функциях.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Правильный код:

import serial
import random
import time
from tkinter import *
from tkinter import messagebox
import os

previous_state=0

def stampa():
  print(previous_state)

def accendi():
  if previous_state == 0:
    TimeDelay = random.randrange(10,20)
    time.sleep(TimeDelay)

    ser.write('L1'.encode())

    previous_state = 1

    USER_TIME = list(ser.read(5).decode("utf8"))

    if USER_TIME[0] == 'T':


        USER_TIME = str(USER_TIME[1])+str(USER_TIME[2])+str(USER_TIME[3])+str(USER_TIME[4])

        print(str(int(USER_TIME,16))+" ms")

    else:

        print("Errore in ricezione")
   else:
    messagebox.showwarning("Attenzione", "Spegnere led per iniziare un nuovo test")

def spegni():
  if previous_state == 1:
    TimeDelay = random.randrange(10,20)
    time.sleep(TimeDelay)

    ser.write('L0'.encode())

    previous_state = 0

    USER_TIME = list(ser.read(5).decode("utf8"))

    if USER_TIME[0] == 'T':

        USER_TIME = str(USER_TIME[1])+str(USER_TIME[2])+str(USER_TIME[3])+str(USER_TIME[4])

        print(str(int(USER_TIME,16))+" ms")


    else:

        print("Errore in ricezione")

  else:
    messagebox.showwarning("Attenzione", "Accendere led per iniziare un nuovo test")


finestra=Tk()
finestra.geometry("520x230")
finestra.title("Misuratore di riflessi")
testo=Label(finestra, text="Premere il pulsante L0 se il LED è acceso\nPremere il pulsante L1 se il LED è spento\nPremere  EXIT per uscire")
testo.grid(row=0, column=0, columnspan=3)
tasto1=Button(finestra, text="L0", command=spegni)
tasto1.grid(row=3, column=0)
tasto2=Button(finestra, text="L1", command=accendi)
tasto2.grid(row=3, column=2)
lista=Listbox(finestra)
lista.insert(END, "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto")
lista.grid(row=0, column= 3, columnspan=5, rowspan=5)     
tasto3=Button(finestra, text="EXIT", command=exit)
tasto3.grid(row=4, column=1)
tastoo=Button(finestra, text="STAMPA", command=stampa)
tastoo.grid(row=1, column=1)

finestra.mainloop()

Я продолжаю пытаться, но не могу использовать переменную для if

0 голосов
/ 14 января 2019

предыдущее состояние написано с ошибкой в ​​первоначальной декларации

import serial

import random

import time

from tkinter import *

from tkinter import messagebox

import os

previuos_state=0

Это делает ваши проверки в начале ваших функций неудачными, так как переменная не объявлена ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...