Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Emil Torsky 07. 11. 2017, 11:58:44
-
Dobry den.
Hram sa s pythonom a tkinter. Narazil som na jeden problem. Ked spustim svoj program tak sa zobrazuje dialog ci chcem pokracovat co je ok ale tiez sa mi zobrazi prazdne okno s hlavickou Tkinter a to je tam stale. Aj ked zavriem program okno nezmyzne. Neviem preco sa to deje. Vedel by niekto poradit?
Dopredu sa ospravedlnujem za kvalitu kodu som zaciatocnik.
Moj kod
https://pastebin.com/nxF6Fr9j
-
Tak tento problem som po 2 hodinach vyriesil. Ale zasekol som sa na niecom inom.
tu je moj kod aj s opravov problemu pred tym https://pastebin.com/u1WP7uJ3 ak by mal niekto zaujem. Zaroven je tam aj moj novy problem.
Watch_dog je funkcia ktora kontroluje ci je logo na obrazovke a cita data s OPC.
Ku konci programu mam GUI kde by som chcel zobrazovat status ci je system online.
if watch_dog == 1:
w = Message(hlavni, text="EP Online")
w.pack()
V terminale mam krasne vypisane ako sa hodnoty menia ale v GUI mi to nezobrazuje nic. Watch_dog je akoby 0.
v com mam chybu? Ako korektne zavolat vystup s Watch_dog tak aby som ho vedel dalej vyuzivat v programe?
A samozrejme printscreen s terminalu https://imgur.com/a/f1r81
-
V té funkci, kde se watchdog nastavuje, zkuste napřed napsat:
global watch_dog
aby se nevytvářela lokální proměnná, která se čistě náhodou jmenuje stejně jako ta globální,
-
Pavel Tišnovský : dakujem. Nastavil som to na global ale bohuzial status v aplikacii sa nezmenil. Spravil som par uprav https://pastebin.com/rLVax3zi ale v casti kodu
if watch_dog == 0:
Label(hlavni, text="EP Offline",
fg="white", bg="red",
font="Verdana 10 bold").pack()
if watch_dog == 1:
Label(hlavni, text="EP Online",
fg="white", bg="green",
font="Verdana 10 bold").pack()
Mi to proste nechce zmenit status ked je watch_dog = 1. Stale sa zobrazuje len prva hodnota akoby bol watch_dog = 0
-
Tak se mi zdá, že spustíš thread, co nejdřív čeká 4 sekundy, než zavolá funkci Check_Logo(ve které nastavuješ proměnnou watch_dog), ale mezitím podle hodnoty watch_dog (která je zatím 0) vytváříš label s příslušným textem a jeho hodnotu už pak nikde dál neaktualizuješ...
-
daks : Ano. Na pozadi by mala bezat nieaka kontrola.
Snazil som sa upravit program tak aby mi zobrazil aktualnu hodnotu s Watchdogu pomocov hlavni.after(100,update_EP_status) ale to nie je ono. Ako donutit okno aby sa autoaticky refreshovalo kazdych xyz sekund ale bez potreby na nieco kliknut ?
hlavni = Tk()
hlavni.title("Ariana 0.1")
hlavni.resizable(width=False, height=False)
hlavni.minsize(200, 250)
hlavni.maxsize(200, 250)
nabidka = Menu(hlavni)
hlavni.config(menu=nabidka)
Label(hlavni, text="Ariana Online",
fg="black",
font="Verdana 10 bold").pack()
def update_EP_status():
v = StringVar()
Label(hlavni, textvariable=v).pack()
if gui_watch_dog == 0:
v.set("EP Offline")
if gui_watch_dog == 1:
v.set("EP Online")
menuSoubor = Menu(nabidka)
nabidka.add_cascade(label="Control", menu=menuSoubor)
menuSoubor.add_command(label=u"Start", command=ask_loop)
menuSoubor.add_command(label=u"Status", command=opc_status)
menuSoubor.add_separator()
menuSoubor.add_command(label="Exit", command=exit_program)
hlavni.after(100,update_EP_status)
mainloop()
-
Ako donutit okno aby sa autoaticky refreshovalo kazdych xyz sekund ale bez potreby na nieco kliknut ?
Refresh labelu, okna, nebo čehokoliv, se může volat z threadu, třeba nějak takto:
from Tkinter import *
import threading
import time
class Worker(threading.Thread):
def __init__(self, val):
self.n = 0
self.val = val
threading.Thread.__init__(self)
self.setDaemon(True)
self.start()
def run(self):
while True:
self.n += 1
self.val.set("HELLO THERE... " + str(self.n))
time.sleep(2)
root = Tk()
lbVal = StringVar()
label = Label(root, text="HELLO THERE...", textvariable=lbVal).pack(padx=20, pady=20)
worker = Worker(lbVal)
mainloop()
-
daks : Velmi velka vdaka za pomoc. Presne toto som potreboval a myslim ze trosku tomu zacinam chapat. Prajem pekny den !