Jump to content

Recommended Posts

Geschrieben

Guten Morgen,

 

ich versuche mich momentan an Python auf meinem Pi. Ich wollte das doe Temperatur in ein Textfeld angezeigt wird. Deshalb habe ich es mit folgedem Code versucht:

(nicht wundern, ist sehr durcheinander und vieles zum Testen drinnen  :))

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Tkinter import *
from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_remote_switch import RemoteSwitch
from tinkerforge.bricklet_temperature import Temperature
import os

#Tinkerforge

HOST = "127.0.0.1"
PORT = 4223
RemoteSwitch_UID = "jNw"
Temperature_UID = "dFu"

root = Tk()

root.title("GUI")

WMWIDTH, WMHEIGHT, WMLEFT, WMTOP = root.winfo_screenwidth(), root.winfo_screenheight(), 0, 0
root.overrideredirect(1)
root.geometry("%dx%d+%d+%d" % (WMWIDTH, WMHEIGHT, WMLEFT, WMTOP))

#Temperature

def cb_temperature(temperature):
#    print('Temperature: ' + str(temperature/100.0) + ' °C')
T.insert(END, 'Temperature: ' + str(temperature/100.0) + ' °C')

if __name__ == "__main__":
	ipcon = IPConnection()
	t = Temperature(Temperature_UID, ipcon)

	ipcon.connect(HOST, PORT)
    
	t.set_temperature_callback_period(1000)

	t.register_callback(t.CALLBACK_TEMPERATURE, cb_temperature)


def shutdown():
    os.system("sudo shutdown -h now")

def reboot():
    os.system("sudo shutdown -r now")

def light_on():
    if __name__ == "__main__":
	ipcon = IPConnection()
	rs = RemoteSwitch(RemoteSwitch_UID, ipcon)

	ipcon.connect(HOST, PORT)

	rs.switch_socket_b(1, 1, RemoteSwitch.SWITCH_TO_ON)

def light_off():
if __name__ == "__main__":
	ipcon = IPConnection()
	rs = RemoteSwitch(RemoteSwitch_UID, ipcon)

	ipcon.connect(HOST, PORT)

	rs.switch_socket_b(1, 1, RemoteSwitch.SWITCH_TO_OFF)

#def netio():
#    os.system("sudo python /home/pi/GUI/tinkerforge/tinkerforge listen --enable-execute")

def exit():
    sys.exit()

#b=Button(root, text= "NetIO", command=netio)
#b.pack()

logo = PhotoImage(file="/home/pi/GUI/images/rpi_inside.gif")
w1 = Label(root, image=logo, height=32, width=32).grid(row=1, column=3)

MyButton1 = Button(root, text="Shutdown", width=10, command=shutdown)
MyButton1.grid(row=1, column=0)

MyButton1 = Button(root, text="Reboot", width=10, command=reboot)
MyButton1.grid(row=2, column=0)

MyButton1 = Button(root, text="Exit", width=10, command=exit)
MyButton1.grid(row=3, column=2)

MyButton1 = Button(root, text="Licht an", width=10, command=light_on)
MyButton1.grid(row=4, column=1)

MyButton1 = Button(root, text="Licht aus", width=10, command=light_off)
MyButton1.grid(row=5, column=1)

T = Text(root, height=2, width=30)
T.grid(row=6, column=3)
T.insert(END, 'Temperature: ' + str(temperature/100.0) + ' °C')
root.mainloop()

 

Das Textfeld wird angezeigt bleibt aber leer. Hoffe jemand könnte einem Anfänger helfen :)

 

Ach ja und was bedeutet dies:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

 

Habe dies einfach mal übernommen aber was hat es das für einen Sinn wenn es doch auskommentiert ist?

 

Grüße

Geschrieben

 

Ach ja und was bedeutet dies:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

 

Habe dies einfach mal übernommen aber was hat es das für einen Sinn wenn es doch auskommentiert ist?

Beim ersten Eintrag handelt es sich um einen shebang #!

Gilt nur bei UNIX-ähnlichen Betriebssystemen. Die Markierung mit Doppelkreuz und Ausrufezeichen führt dazu, dass das folgende Kommando mitsamt allen angegebenen Argumenten beim Aufruf des Programms ausgeführt wird.

 

Beim zweiten Eintrag vermute ich die Zeichensatzcodierung des geschriebenen Textes (Skript).

Geschrieben

Du hast da mehrere Probleme in deinem Script.

 

Die if __name__ == "__main__": Blöcke gehören so nicht innerhalb von Funktionen, bzw. machen da keinen Sinn.

 

Du hast bei der Einrückung Tabs und Spaces gemischt, das mag Python im Zweifels so nicht und führt zu komischen Problemen, da Blöcke in Python durch Einrückung gebildet werden.

 

Die Registrierung und Aktivierung des Temperature-Callbacks erfolgt in der Callback Funktion. Dass kann so nicht funktionieren, das muss außerhalb von cb_temperature() passieren.

 

Etwa so:

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Tkinter import *
from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_remote_switch import RemoteSwitch
from tinkerforge.bricklet_temperature import Temperature
import os

#Tinkerforge

HOST = "127.0.0.1"
PORT = 4223
RemoteSwitch_UID = "jNw"
Temperature_UID = "dFu"

root = Tk()

root.title("GUI")

WMWIDTH, WMHEIGHT, WMLEFT, WMTOP = root.winfo_screenwidth(), root.winfo_screenheight(), 0, 0
root.overrideredirect(1)
root.geometry("%dx%d+%d+%d" % (WMWIDTH, WMHEIGHT, WMLEFT, WMTOP))

#Temperature
T = None

def cb_temperature(temperature):
    #print('Temperature: ' + str(temperature/100.0) + ' °C')
    T.insert(END, 'Temperature: ' + str(temperature/100.0) + ' °C\n')

def shutdown():
    os.system("sudo shutdown -h now")

def reboot():
    os.system("sudo shutdown -r now")

def light_on():
    rs.switch_socket_b(1, 1, RemoteSwitch.SWITCH_TO_ON)

def light_off():
    rs.switch_socket_b(1, 1, RemoteSwitch.SWITCH_TO_OFF)

#def netio():
#    os.system("sudo python /home/pi/GUI/tinkerforge/tinkerforge listen --enable-execute")

def exit():
    sys.exit()

#b=Button(root, text= "NetIO", command=netio)
#b.pack()

# Create UI
logo = PhotoImage(file="/home/pi/GUI/images/rpi_inside.gif")
w1 = Label(root, image=logo height=32, width=32).grid(row=1, column=3)

MyButton1 = Button(root, text="Shutdown", width=10, command=shutdown)
MyButton1.grid(row=1, column=0)

MyButton1 = Button(root, text="Reboot", width=10, command=reboot)
MyButton1.grid(row=2, column=0)

MyButton1 = Button(root, text="Exit", width=10, command=exit)
MyButton1.grid(row=3, column=2)

MyButton1 = Button(root, text="Licht an", width=10, command=light_on)
MyButton1.grid(row=4, column=1)

MyButton1 = Button(root, text="Licht aus", width=10, command=light_off)
MyButton1.grid(row=5, column=1)

T = Text(root, height=2, width=30)
T.grid(row=6, column=3)

# Create Tinkerforge objects
ipcon = IPConnection()
rs = RemoteSwitch(RemoteSwitch_UID, ipcon)
t = Temperature(Temperature_UID, ipcon)

ipcon.connect(HOST, PORT)

t.register_callback(t.CALLBACK_TEMPERATURE, cb_temperature)
t.set_temperature_callback_period(1000)

# Start mainloop
root.mainloop()

Geschrieben

Danke für eure beiden Antworten  :) wieder etwas neues gelernt.

 

Ich habe den Code mal ausprobiert und nun fügt er die Werte in das Textfeld aber diese werden nicht aktuallisiert sondern in eine neue Zeile nochmal geschrieben. Wie müsste ich da vorgehen? Das Textfeld entfernen und wieder mit neuem Wert erstellen?

Geschrieben

Da muss du zuerst den aktuellen Text aus dem Textfeld löschen. Das geht z.B, mit

 

T.delete(1.0, END)

 

bevor du mit T.insert() in der cb_temperature() Funktionen neuen einfügst. Etwa so:

 

def cb_temperature(temperature):
    #print('Temperature: ' + str(temperature/100.0) + ' °C')
    T.delete(1.0, END)
    T.insert(END, 'Temperature: ' + str(temperature/100.0) + ' °C\n')

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...