Porovnavaní hodnot z Seriove linky – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Porovnavaní hodnot z Seriove linky – Python – Fórum – Programujte.comPorovnavaní hodnot z Seriove linky – Python – Fórum – Programujte.com

 

Radek
~ Anonymní uživatel
133 příspěvků
10. 1. 2018   #1
-
0
-

Dobrý den,

potřeboval bych poradit potřebuju doladit tenhle program aby vůbec fungoval jsem v pythonu uplny začatečník takže nevim pořadně co snim jde dělat. Ale potřebuju aby po posladni jedničky na seriovou linku ziskal hodnotu a tu porovnal a podle toho vykreslil obrazek jeden z 256. Protože na seriovou linku přijdou logicke vystupy z opickych senzoru a potřebuju prokazat jake jsou sepnute a jake ne :)

Děkuju za pomoc či vylepšení kodů

# -*- coding: cp1250 -*-
from Tkinter import *
import serial
import time

root = Tk()
root.wait_visibility(root)          #zajistí, že je okno stále
root.attributes('-topmost',1)       #viditelné
root.title("senzor polohy")
x = 400
y = 400

w = Label(root, text= "Stav senzoru")
w.pack(pady=10)

obr = Canvas(root, width=x, height=y, bg="gray")
obr.pack()

obr1 = PhotoImage(file="zastinena0.gif")
obr2 = PhotoImage(file="zastinena1.gif")
obr3 = PhotoImage(file="zastinena2.gif")
obr4 = PhotoImage(file="zastinena3.gif")
obr5 = PhotoImage(file="zastinena4.gif")
obr6 = PhotoImage(file="zastinena5.gif")
obr7 = PhotoImage(file="zastinena6.gif")
obr8 = PhotoImage(file="zastinena7.gif")
obr9 = PhotoImage(file="zastinena8.gif")
obr.create_image(x/2, y/2, image=obr1)

def nula():
    obr.create_image(x/2, y/2, image=obr1)
    
def jeden():
    obr.create_image(x/2, y/2, image=obr2)

def dva():
    obr.create_image(x/2, y/2, image=obr3)

def tri():
    obr.create_image(x/2, y/2, image=obr4)

def ctyri():
    obr.create_image(x/2, y/2, image=obr5)

def pet():
    obr.create_image(x/2, y/2, image=obr6)

def sest():
    obr.create_image(x/2, y/2, image=obr7)

def sedm():
    obr.create_image(x/2, y/2, image=obr8)

def osm():
    obr.create_image(x/2, y/2, image=obr9)

while(True):
    
            port = serial.Serial("COM4",9600,timeout = 120)
            port.write("1")
            rx = port.readline()
            port.close()
            print (rx)
    
            if  (rx==0):
                 nula()
            elif (rx==1):
                        jedna()
            elif (rx==2):
                        dva()
            elif (rx==3):
                        tri()
            elif (rx==4):
                        ctyri()
            elif (rx==5):
                        pet()
            elif (rx==6):
                        sest()
            elif (rx==7):
                        sedm()
            elif (rx==8):
                        osm()
                        print "help"
            else:

root.mainloop()
Nahlásit jako SPAM
IP: 78.45.85.–
gna
~ Anonymní uživatel
1891 příspěvků
11. 1. 2018   #2
-
0
-

Ty obrázky můžeš mít v listu a načítat je v cyklu. Nepotřebuješ na to hafo samostatných proměnných.

create_image vytvoří na canvasu objekt, který zobrazuje ten obrázek. Stačí vytvořit jeden a měnit mu obrázek.

Fungování TkInteru probíhá v mainloop. Když před tím máš nekončící cyklus, tak na mainloop nedojde.

TkInter (stejně jako většina GUI) funguje na principu postupného zpracovávání událostí (v mainloop), takže blokující operace blokne všechno. Můžeš třeba to čtení dělat v samostatném vlákně a data vkládat do fronty, kterou budeš v hlavním vlákně periodicky vybírat.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
11. 1. 2018   #3
-
0
-

   

from Tkinter import *
import Queue
import random
import threading
import time

root = Tk()

canvas_width = 400
canvas_height = 400
image_list = [PhotoImage(file="zastinena%d.gif" % i) for i in range(256)]

label = Label(root, text="Stav senzoru")
label.pack(pady=10)

canvas = Canvas(root, width=canvas_width, height=canvas_height, bg="gray")
canvas.pack()

image_id = canvas.create_image(canvas_width / 2, canvas_height / 2)

queue = Queue.Queue()

def update_image():
    while not queue.empty():
        item = queue.get()
        canvas.itemconfig(image_id, image=image_list[item])
    root.after(100, update_image)

def thread_func():
    while True:
        time.sleep(1)
        item = random.randrange(len(image_list))
        queue.put(item)

thread = threading.Thread(target=thread_func)
thread.daemon = True
thread.start()

update_image()
root.mainloop()
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
11. 1. 2018   #4
-
0
-

Tohle je hnus, ale mělo by z toho být pochopitelné, co to dělá.

Místo generování náhodných čísel si dáš to čtení ze sériáku. Jen ještě bacha na to, že readline pravděpodobně vrací string, takže ho musíš ještě převést na celé číslo (cislo = int(text)).

Nahlásit jako SPAM
IP: 213.211.51.–
Radek
~ Anonymní uživatel
133 příspěvků
16. 1. 2018   #5
-
0
-

Děkuji za pomoc ale nechce mi to vyhazovat ted ty obrazky když jsem dal seriovou linku
 

from Tkinter import *
import Queue
import random
import threading
import time
import serial

root = Tk()

canvas_width = 400
canvas_height = 400
image_list = [PhotoImage(file="zastinena%d.gif" % i) for i in range(8)]

label = Label(root, text="Stav senzoru")
label.pack(pady=10)

canvas = Canvas(root, width=canvas_width, height=canvas_height, bg="gray")
canvas.pack()

image_id = canvas.create_image(canvas_width / 2, canvas_height / 2)

queue = Queue.Queue()

def update_image():
    while not queue.empty():
        item = queue.get()
        canvas.itemconfig(image_id, image=image_list[item])
    root.after(100, update_image)
def zavolej():
    while True:
        port = serial.Serial("COM4",9600,timeout = 100)
        port.write("1")
        rx = port.readline()
        port.close()
        rx = int(rx)
        print (rx)
        item = rx
        queue.put(item)
zavolej()
update_image()
root.mainloop()
Nahlásit jako SPAM
IP: 78.45.85.–
Radek
~ Anonymní uživatel
133 příspěvků
16. 1. 2018   #6
-
0
-

Už to mám děkuju  

from Tkinter import *
import Queue
import random
import threading
import serial

root = Tk()

canvas_width = 400
canvas_height = 400
image_list = [PhotoImage(file="zastinena%d.gif" % i) for i in range(8)]

label = Label(root, text="Stav senzoru")
label.pack(pady=10)

canvas = Canvas(root, width=canvas_width, height=canvas_height, bg="gray")
canvas.pack()

image_id = canvas.create_image(canvas_width / 2, canvas_height / 2)

queue = Queue.Queue()

def update_image():
    while not queue.empty():
        item = queue.get()
        canvas.itemconfig(image_id, image=image_list[item])
    root.after(100, update_image)
def zavolej():
    while True:
        port = serial.Serial("COM4",9600,timeout = 100)
        port.write("1")
        rx = port.readline()
        port.close()
        rx = int(rx)
        print (rx)
        item = (rx)
        queue.put(item)
        
thread= threading.Thread(target=zavolej)
thread.daemon = True
thread.start()
print "ahoj"
update_image()
root.mainloop()
Nahlásit jako SPAM
IP: 78.45.85.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Porovnávání hodnot — založil jula

Linky v Textboxu — založil Denis

Linky na vaše programy — založil R4STO

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý