.after timing einstellen

Fragen zu Tkinter.
Antworten
Makusm
User
Beiträge: 9
Registriert: Dienstag 19. Januar 2021, 13:21

Hallo allerseits!

ich bin stehe gerade vor einem Problem...es ist mein erster Code mit Tkinter und soweit klappt alles was ich will...aber jetzt komme ich einfach nicht weiter....ich will die ms per usereingabe anpassen lassen....

stelle ich die ms manuell ein (x=500 im bsp), funktioniert alles einwandfrei....versuche ich es über eine .get() zu übertragen bekomme ich folgenden fehler: _tkinter.TclError: bad argument "": must be cancel, idle, info, or an integer.....
all meine Versuche das Problem zu lösen bringen mich immer wieder zum Anfang zurück....

Code: Alles auswählen

import tkinter
from bs4 import BeautifulSoup as bs
import requests
import time
from tkinter import *


root = Tk()
root.title("GameStop")

x = set_interval_field = tkinter.Entry()
set_interval_field.grid(row=0,column=1)

x = set_interval_field.get()

#x = 500


def click_to_start():
        def refresh():
                res = requests.get('https://www.ls-tc.de/de/aktie/gamestop-aktie')   
                soup = bs(res.text,features="html.parser")
                price = soup.find_all("div", {"class":"mono"})[0].find("span").text
                current_time = time.strftime("%H:%M:%S")

                stock_label.config(text=price +"€ "+current_time)
                stock_label.after(x,refresh)
                start_button.config(text="Running...")

        stock_label = Label(root,width=30)
        stock_label.grid(row=1,column=0,columnspan=2)
        stock_label.after(x,refresh)        
        
start_button = Button(root,width=10,text="Starten", padx=5, pady=5, command=click_to_start)
start_button.grid(row=0,column=0)

root.mainloop()
      
        
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Du importierst tkinter sowohl als Modul als auch per *. Zweiteres ist schlecht, weil man nicht kontrollieren kann, welche Namen da importiert werden.
BeautifulSoup in bs umzubennenen ist schlecht, weil weniger aussagekräftig. BeautifulSoup ist auch eine Klasse und hält sich an die Namenskonvention, bs nicht.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.

Benutze keine globalen Variablen, alles was eine Funktion braucht, sollte sie über ihre Argumente bekommen. Verschachtle keine Funktionen ineinander.
Man sollte keine neuen Widgets nachträglich erzeugen, vor allem nicht eins bei jedem Knopfdruck, das die anderen überdeckt.
Wenn man einmal ein x (ein sehr schlechter Name) bestimmt, dann hat eine Änderung des Eingabefeldes natürlich keinen Einfluß. Die Fehlermeldung ist ja eindeutig, das after eine Zahl erwartet und keinen String.
Beim Entry-Feld fehlt root.
Alles auf oberster Ebene sollte nicht irgendwie verstreut in der Programmdatei stehen, sondern in einer main-Funktion.

Code: Alles auswählen

from functools import partial
import datetime
import requests
import tkinter as tk
from bs4 import BeautifulSoup

LS_TC_URL = 'https://www.ls-tc.de/de/aktie/gamestop-aktie'

def refresh(stock_label, interval):
    response = requests.get(LS_TC_URL)
    soup = BeautifulSoup(response.text, features="html.parser")
    price = soup.find_all("div", {"class":"mono"})[0].find("span").text

    current_time = datetime.datetime.now()
    stock_label.config(text=f"{price}€ {current_time:%H:%M:%S}")
    stock_label.after(interval.get(), refresh, stock_label, interval)


def click_to_start(start_button, stock_label, interval):
    start_button.config(text="Running...")
    stock_label.after(interval.get(), refresh, stock_label, interval)


def main():
    root = tk.Tk()
    root.title("GameStop")
    
    interval = tk.IntVar(root, 1000)
    set_interval_field = tk.Entry(root, textvariable=interval).grid(row=0,column=1)

    stock_label = tk.Label(root, width=30)
    stock_label.grid(row=1,column=0,columnspan=2)

    start_button = tk.Button(root, width=10, text="Starten", padx=5, pady=5)
    start_button['command'] = partial(click_to_start, start_button, stock_label, interval)
    start_button.grid(row=0,column=0)
    root.mainloop()
      
if __name__ == "__main__":
    main()
Makusm
User
Beiträge: 9
Registriert: Dienstag 19. Januar 2021, 13:21

uff....das ist ganz schön viel Kritik auf die ich nicht gefasst war....
ich bin seit zwei Tagen daran mir das selber beizubringen....


aber wenn ich jetzt deine Lösung mit meiner vergleiche...war ich ja auf dem richtigen wege
Antworten