Portál AbcLinuxu, 27. dubna 2024 04:19


Dotaz: Aktualizace GUI v tKinteru

19.5.2020 11:15 Vašek
Aktualizace GUI v tKinteru
Přečteno: 684×
Odpovědět | Admin
Zdravím, mám jednoduchý program v pythonu - counter, který chci zobrazovat v GUI. Po aktualizaci hodnoty counter chci toto zobrazit v GUI. GUi je generováno z PAGE. Někde dělám chybu, asi s vložením do Labelu na řádku 31

Celý kód je zde. https://pastebin.com/z5S6ZuKX

Děkuji za jakoukoli radu.

V.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.5.2020 11:43 debian+
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechces radsej robit v PyGTK? Tk nie je az taky main stream.
Gréta avatar 19.5.2020 12:38 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru
Odpovědět | | Sbalit | Link | Blokovat | Admin

celkem patlanina tvuj zdrojáček jako :D

kopíruju jak je z paste bin sem

#! /usr/bin/env python
#  -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 5.0.3
#  in conjunction with Tcl version 8.6
#    May 19, 2020 10:28:15 AM CEST  platform: Windows NT

import sys

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

try:
    import ttk
    py3 = False
except ImportError:
    import tkinter.ttk as ttk
    py3 = True

import speedmeter_support

count = 0
def main():
    global count
    while (count < 100):
        
        
        count = count + 1
        self.lblspeed.configure(text=count) #tady chci do vložit text do Labelu
        
        root.after(10, vp_start_gui) # Tady zavolat a znova vykreslit GUI
        
    else:
        pass


def vp_start_gui():
    '''Starting point when module is the main routine.'''
    global val, w, root
    root = tk.Tk()
    top = Toplevel1 (root)
    speedmeter_support.init(root, top)
    self.lblspeed.configure(text=count)
    root.after(100, main)
    root.mainloop()

w = None
def create_Toplevel1(rt, *args, **kwargs):
    '''Starting point when module is imported by another module.
       Correct form of call: 'create_Toplevel1(root, *args, **kwargs)' .'''
    global w, w_win, root
    #rt = root
    root = rt
    w = tk.Toplevel (root)
    top = Toplevel1 (w)
    speedmeter_support.init(w, top, *args, **kwargs)
    return (w, top)

def destroy_Toplevel1():
    global w
    w.destroy()
    w = None

class Toplevel1:
    def __init__(self, top=None):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9' # X11 color: 'gray85'
        _ana1color = '#d9d9d9' # X11 color: 'gray85'
        _ana2color = '#ececec' # Closest X11 color: 'gray92'
        font10 = "-family {Digital-7} -size 24"
        font9 = "-family {Digital-7} -size 20"

        top.geometry("600x450+297+157")
        top.minsize(120, 1)
        top.maxsize(3460, 1181)
        top.resizable(0, 0)
        top.title("Speedmeter")
        top.configure(background="#d9d9d9")

        self.Speed = tk.Label(top)
        self.Speed.place(relx=0.267, rely=0.156, height=31, width=304)
        self.Speed.configure(background="#d9d9d9")
        self.Speed.configure(disabledforeground="#a3a3a3")
        self.Speed.configure(font=font9)
        self.Speed.configure(foreground="#000000")
        self.Speed.configure(text="Počet")

        self.lblspeed = tk.Label(top)
        self.lblspeed.place(relx=0.333, rely=0.311, height=201, width=224)
        self.lblspeed.configure(background="#d9d9d9")
        self.lblspeed.configure(disabledforeground="#a3a3a3")
        self.lblspeed.configure(font=font10)
        self.lblspeed.configure(foreground="#000000")
        self.lblspeed.configure(text=count)

if __name__ == '__main__':
    vp_start_gui()

 

takže co s tim....... nóó uplně zaprvý tamtou proměnou self oběkt přistupuje sám k sobě jeto jako 'this' v jinejch jazycích nóóó a funguje jenom v metodách danýho oběktu. zvenku ho nemužeš volat :'( :'(

vopravit to de na řádečku 45 přepsáním self na top kde top je jakoby tamten náš voběkt třídy toplevel1

top.lblspeed.configure(text=count)

dál tamta funkce root.after vp_start_gui ti pokaždý udělá nový vokýnko pro každej ten update. ty potřebuješ změnit jenom hodnotu tamty komponenty a gui jakoby jenom updatenout.

 

a funkce main na

def main():
    global count, root
    while (count < 100):
        
        
        count = count + 1
        #self.lblspeed.configure(text=count) #tady chci do vložit text do Labelu
        
        #root.after(10, vp_start_gui) # Tady zavolat a znova vykreslit GUI
        top = Toplevel1 (root)
        top.lblspeed.configure(text=count)
        root.update_idletasks()
        
    else:
        pass

 

ale na vopravování/předělávání tam toho jako máš eště dost :O :O třeba jako uplně neni dobrý míchat oběktově orientovanej návrch s těma globálníma proměnýma a celý jeto nějaký takový divný :D ale jóó funguje :D :D ;D

oslavná píseň na pana soudruha generalisima prezidentčíka Petra Pavla Pávka 🎶🫡🦚🎶
19.5.2020 13:54 Vašek
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru

Zdravím, tady mám celý kód, do main() jsem vložil zpoždění, jinak se program stále překresloval. GUI se sice aktualizuje, ale celé, ne jen tento Label.

https://pastebin.com/7uPzHUwX

Jak prosím vložit kód tak aby šel rozbalit?

 

Jsem zde i v programování nový.

Gréta avatar 19.5.2020 16:33 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru

nevim jestli de v tom tkinteru jakoby aktulatizovat jenom nějakej jeden element :O :O

tady hele je nějaký řešení pomocí callbacku bez ručního volání update se to podobá tomu co asi jako chceš ;D

nóó a nejseš jako první kdo se tady jako ptá jak sem strčit vobarvenej rozbalovací zdrojáček hele :O :D :D ;D joa někdy jim to nadává na věčítka > a menčítka < se musej přepsat do html kódu hele jestli je v zdrojáčku máš aby je to nevidělo jako html tag ;D

20.5.2020 01:19 .
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru
Jasně, že jde aktualizovat jen jeden element, to dělá to configure. Napíšeš mu, jak dělá pořád nové okno a pak tam jebneš konstruktor, jakože na překreslování? A udělej si další účet na seriózní odpovědi, kde nebudeš psát jak píča.
Gréta avatar 20.5.2020 11:37 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru

jenže tam furt jakoby musíš mit někde ten vykreslovací loop co dělá že všecko aktualizuje. tamta funkce root.mainloop se prej +- rovná

while True:
    tk.update_idletasks()
    tk.update()

a tomu zaloopovanýmu volání update tak jak tam jako je se chce vašek z nějakýho záhadnýho důvodu vyhnout a přemejšlí jestli to de jenom jakoby právě pro jeden jedinej element. nóóó a todle nevim jestli de v tkinteru udělat a eště navíc jakoby nějak jednoduše :O :O

si myslim žeto je zbytečný řešit a spíš to svěčí vo nějakejch dalších problémech ve zdrojáčku jakože někde něčemu mění atributy nechce abyseto updatlo nebo tak něco. nóó ale i tak todleto jako nevim :D ;D

noa sorry jako žese snažim pomoct jak jako nejlíp umim :O :/ si druhej účet kde budeš mluvit slušně spíš založ ty ;D ;D

20.5.2020 01:15 .
Rozbalit Rozbalit vše Re: Aktualizace GUI v tKinteru
Odpovědět | | Sbalit | Link | Blokovat | Admin
def vp_start_gui():
    ...
    top = Toplevel1 (root)
    root.after(100, top.update)

class Toplevel1:
    ...
    count = 0
    def update(self):
        if self.count < 100:
            self.count += 1
            self.lblspeed.configure(text=self.count)
            root.after(100, self.update)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.