Tkinter neziaduce okno

Emil Torsky

Tkinter neziaduce okno
« kdy: 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


Emil Torsky

Re:Tkinter neziaduce okno
« Odpověď #1 kdy: 07. 11. 2017, 14:27:30 »
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.
Kód: [Vybrat]
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

Pavel Tišnovský

Re:Tkinter neziaduce okno
« Odpověď #2 kdy: 07. 11. 2017, 16:25:54 »
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í,

Emil Torsky

Re:Tkinter neziaduce okno
« Odpověď #3 kdy: 08. 11. 2017, 10:22:24 »
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
Kód: [Vybrat]
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

daks

Re:Tkinter neziaduce okno
« Odpověď #4 kdy: 08. 11. 2017, 11:09:21 »
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š...


Emil Torsky

Re:Tkinter neziaduce okno
« Odpověď #5 kdy: 09. 11. 2017, 10:11:15 »
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 ?

Kód: [Vybrat]
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()

daks

Re:Tkinter neziaduce okno
« Odpověď #6 kdy: 09. 11. 2017, 10:53:03 »
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:

Kód: [Vybrat]
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()

Emil Torsky

Re:Tkinter neziaduce okno
« Odpověď #7 kdy: 09. 11. 2017, 13:36:12 »
daks : Velmi velka vdaka za pomoc. Presne toto som potreboval a myslim ze trosku tomu zacinam chapat. Prajem pekny den !