Seite 1 von 2

GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 10:53
von Schlitzaaa
Guten tag liebe Leute,
ich wende mich in der stunde der not an euch ^^
ich habe morgen eine abgabe eines selbsterstellten gui's
nun stehe ich aber vor einem problem
ich möchte das mein gui 1 button beinhaltet welcher durch drücke auslöst, dass ein spruch einer externen json datei (ca. 50 Sprüche)
random ausgewählt wird und im gui erscheint
aber er gibt mir immer wieder error aus

meine json:https://hastebin.com/esedowoqez.json

mein gui: https://hastebin.com/azatokareg.py

könnte mir vllt irgendwer helfen ich verzweifle noch ^^

MfG Schlitza

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 11:17
von lackschuh
Moin

ggf. ist ``data[u'sprüche']`` des Rätsels Lösung

So mal auf die Schnelle ohne Button und ohne Gewähr:

Code: Alles auswählen

# coding: utf-8

import json
import Tkinter as tk
import random


class MyWindow(tk.Frame):

    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, parent)
        self.my_label = tk.Label(self)
        self.my_label.grid(row=1, column=1)

    def update_label(self, json_data):
        self.my_label['text'] = json_data


def read_json_file(my_label):
    with open('test.json') as json_data:
        data = json.load(json_data)
        jokes = random.choice(data[u'sprüche'])
        my_label.update_label(jokes)
        my_label.after(1000, read_json_file, my_label)


def main():
    root = tk.Tk()
    my_label = MyWindow(root)
    read_json_file(my_label)
    my_label.pack(side=tk.TOP)
    root.mainloop()


if __name__ == '__main__':
    main()

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 11:24
von narpfel
Moin,

was für einen Fehler erhältst du denn?

Zu deinem Code: Sternchen-Importe sollten nicht verwendet werden, weil man damit nicht kontrollieren kann, was für Namen man sich damit importiert und es leicht zu Namenskollisionen kommen kann. `tkinter` wird üblicherweise mit `import tkinter as tk` importiert, sodass man auf die Namen in dem Modul mit `tk.` zugreifen kann, wie man lackschuhs Beispiel sehen kann.

Klassennamen werden üblicherweise in `CamelCase` geschrieben, damit man sie von Funktions- und Variablennamen unterscheiden kann.

@lackschuh: Schlitzaaa verwendet Python 3, wodurch der `u`-Präfix keine Auswirkungen hat.

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 11:25
von lackschuh
@narpfel
Stimmt. Jetzt wo du es sagst ;)

examples ist nicht definiert und

Code: Alles auswählen

fenster = hauptteil()
fenster.mainloop()
ist auch falsch.

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 14:33
von Schlitzaaa
narpfel hat geschrieben:Moin,

was für einen Fehler erhältst du denn?

Zu deinem Code: Sternchen-Importe sollten nicht verwendet werden, weil man damit nicht kontrollieren kann, was für Namen man sich damit importiert und es leicht zu Namenskollisionen kommen kann. `tkinter` wird üblicherweise mit `import tkinter as tk` importiert, sodass man auf die Namen in dem Modul mit `tk.` zugreifen kann, wie man lackschuhs Beispiel sehen kann.

Klassennamen werden üblicherweise in `CamelCase` geschrieben, damit man sie von Funktions- und Variablennamen unterscheiden kann.

@lackschuh: Schlitzaaa verwendet Python 3, wodurch der `u`-Präfix keine Auswirkungen hat.
ich möchte erwähnen, dass dies nicht der erste verusch war ich habe mit import tkinter as tk angefangen aber dann durch googeln und aufsaugen von allem möglichen angefangen komplett zu versagen und alles durcheinanderzubringen :D

Ich danke dir für den hilfreichen Beitrag :))

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 14:34
von Schlitzaaa
lackschuh hat geschrieben:Moin

ggf. ist ``data[u'sprüche']`` des Rätsels Lösung

So mal auf die Schnelle ohne Button und ohne Gewähr:

Code: Alles auswählen

# coding: utf-8

import json
import Tkinter as tk
import random


class MyWindow(tk.Frame):

    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, parent)
        self.my_label = tk.Label(self)
        self.my_label.grid(row=1, column=1)

    def update_label(self, json_data):
        self.my_label['text'] = json_data


def read_json_file(my_label):
    with open('test.json') as json_data:
        data = json.load(json_data)
        jokes = random.choice(data[u'sprüche'])
        my_label.update_label(jokes)
        my_label.after(1000, read_json_file, my_label)


def main():
    root = tk.Tk()
    my_label = MyWindow(root)
    read_json_file(my_label)
    my_label.pack(side=tk.TOP)
    root.mainloop()


if __name__ == '__main__':
    main()

ich danke dir von herzen :D aber du hättest das jz nicht extra schreiben müssen :) wollte eigentlich nur hilfe aber auch in diser form ist hilfe hilfe :D
und umso einfacher für mich :)
möchte nur niemandem umstände machen ^^

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 14:36
von Schlitzaaa
lackschuh hat geschrieben:@narpfel
Stimmt. Jetzt wo du es sagst ;)

examples ist nicht definiert und

Code: Alles auswählen

fenster = hauptteil()
fenster.mainloop()
ist auch falsch.
okey und was muss ich da jz noch abändern ? im prinzip ja root usw weil root nicht gleich fenster ist (wenn ich das auf mein voriges beziehe ?
und mylabel müsste dann der json datei name werden oder versteh ich was falsch ?

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 15:26
von Schlitzaaa
hmmm er gibt mir nen error von wegen 'MyWindow' is not defined

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 15:40
von narpfel
Wo ist `MyWindow` denn definiert und wo wird es verwendet?

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 15:50
von Schlitzaaa
narpfel hat geschrieben:Wo ist `MyWindow` denn definiert und wo wird es verwendet?
ich habe einfach den code von lackschuh genommen in original reinkopiert (extra datei) damit ich testen kann wann es funktioniert und wann nicht und ich habe bis jz nocht nix verändert und er gibt den fehler aus

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:02
von __deets__
Statt eine Anleitung zu verfassen, wie man - unter Umstaenden - den Code sich selbst zusammenbasteln kann, unter Anwendung irgendwelcher Dinge, die du gemacht, aber nicht klar genug beschrieben hast - waere es da nicht viel einfacher wenn du den einfach *zeigst*? Oder veranstaltest du lieber Ratespiele fuer die naechsten 20 Posts?

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:18
von lackschuh
Es ist immer wichtig, dass die komplette Fehlermeldung gepostet wird. Geht nicht, läuft nicht etc. hilft niemand weiter, dein Problem zu verstehen.
Das Obige mal für Python3.x lauffähig gemacht. Ich benutze selber keine GUI Rahmenwerke. Im Unterforum >Tkinter< findest du zahlreiche Informationen, wie eine GUI aufgebaut wird.

Code: Alles auswählen

import tkinter as tk
import json
import random


class MyWindow(tk.Frame):

    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, parent)
        self.label_text = tk.StringVar()
        self.my_label = tk.Label(self, textvariable=self.label_text)
        self.my_label.grid(row=1, column=1)
        self.button = tk.Button(self, text="Nächster Spruch", command=self.read_json_file)
        self.button.grid(row=2, column=1)

    def read_json_file(self):
        with open('jokes.json', encoding='utf8') as json_data:
            data = json.load(json_data)
            self.label_text.set(random.choice(data['sprüche']))


def main():
    root = tk.Tk()
    my_app = MyWindow(root)
    my_app.pack(side=tk.TOP)
    root.mainloop()


if __name__ == '__main__':
    main()
 

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:21
von narpfel
@Schlitzaaa: Das kann eigentlich nicht sein. `MyWindow` wird in lackschuhs Code einmal verwendet, und man kann deutlich sehen, dass es vorher definiert wurde.

Ich schließe mich lackschuh und __deets__ an: Bitte zeige den Code exakt so, wie du ihn ausführst (am besten auf der Kommandozeile, IDEs können Nebenwirkungen haben, die man als Anfänger nicht immer sieht oder umgehen kann), und zeige die komplette Fehlermeldung (per Copy-Paste).

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:23
von Schlitzaaa
__deets__ hat geschrieben:Statt eine Anleitung zu verfassen, wie man - unter Umstaenden - den Code sich selbst zusammenbasteln kann, unter Anwendung irgendwelcher Dinge, die du gemacht, aber nicht klar genug beschrieben hast - waere es da nicht viel einfacher wenn du den einfach *zeigst*? Oder veranstaltest du lieber Ratespiele fuer die naechsten 20 Posts?
Traceback (most recent call last):
File "C:/Users/Schlitza/AppData/Local/Programs/Python/Python36-32/forum orig.py", line 6, in <module>
class MyWindow(tk.Frame):
File "C:/Users/Schlitza/AppData/Local/Programs/Python/Python36-32/forum orig.py", line 32, in MyWindow
main()
File "C:/Users/Schlitza/AppData/Local/Programs/Python/Python36-32/forum orig.py", line 26, in main
my_label = MyWindow(root)
NameError: name 'MyWindow' is not defined

Hier bitteschön tut mir leid das ich nicht davon ausgegangen bin das noch jmd außer mir lackschuh und narpfel den post liest

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:26
von __deets__
Das ist die Fehlermeldung, aber es fehlt immer noch der Code.

Wenn du Hilfe bekommen willst, musst du die Informationen liefern, die wir brauchen, um eben das zu tun. Niemand kann deine Gedanken lesen, deinen Bildschirm sehen, deine Festplatte durchwuehlen. Das musst du uns schon darlegen. Und das gilt uebrigens auch fuer narpfel und lackschuh. Nicht nur fuer andere.

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:28
von narpfel
@Schlitzaaa: Der Traceback passt zu keinem der beiden Programme, die lackschuh gepostet hat. Zeige bitte den Code, den du ausführst.

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:29
von Schlitzaaa
lackschuh hat geschrieben:Es ist immer wichtig, dass die komplette Fehlermeldung gepostet wird. Geht nicht, läuft nicht etc. hilft niemand weiter, dein Problem zu verstehen.
Das Obige mal für Python3.x lauffähig gemacht. Ich benutze selber keine GUI Rahmenwerke. Im Unterforum >Tkinter< findest du zahlreiche Informationen, wie eine GUI aufgebaut wird.

Code: Alles auswählen

import tkinter as tk
import json
import random


class MyWindow(tk.Frame):

    def __init__(self, parent):
        self.parent = parent
        tk.Frame.__init__(self, parent)
        self.label_text = tk.StringVar()
        self.my_label = tk.Label(self, textvariable=self.label_text)
        self.my_label.grid(row=1, column=1)
        self.button = tk.Button(self, text="Nächster Spruch", command=self.read_json_file)
        self.button.grid(row=2, column=1)

    def read_json_file(self):
        with open('jokes.json', encoding='utf8') as json_data:
            data = json.load(json_data)
            self.label_text.set(random.choice(data['sprüche']))


def main():
    root = tk.Tk()
    my_app = MyWindow(root)
    my_app.pack(side=tk.TOP)
    root.mainloop()


if __name__ == '__main__':
    main()
 
hierbei bekomme ich diesen error:

Traceback (most recent call last):
File "C:/Users/Schlitza/AppData/Local/Programs/Python/Python36-32/forum py3x.py", line 30, in <module>
main()
NameError: name 'main' is not defined

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:31
von Schlitzaaa
__deets__ hat geschrieben:Das ist die Fehlermeldung, aber es fehlt immer noch der Code.

Wenn du Hilfe bekommen willst, musst du die Informationen liefern, die wir brauchen, um eben das zu tun. Niemand kann deine Gedanken lesen, deinen Bildschirm sehen, deine Festplatte durchwuehlen. Das musst du uns schon darlegen. Und das gilt uebrigens auch fuer narpfel und lackschuh. Nicht nur fuer andere.
das ist lackschuhs code für py3.x:

Code: Alles auswählen

import tkinter as tk
import json
import random


class MyWindow(tk.Frame):

        def __init__(self, parent):
            self.parent = parent
            tk.Frame.__init__(self, parent)
            self.label_text = tk.StringVar()
            self.my_label = tk.Label(self, textvariable=self.label_text)
            self.my_label.grid(row=1, column=1)
            self.button = tk.Button(self, text="Nächster Spruch", command=self.read_json_file)
            self.button.grid(row=2, column=1)

        def read_json_file(self):
            with open('jokes.json', encoding='utf8') as json_data:
                data = json.load(json_data)
                self.label_text.set(random.choice(data['sprüche']))

        def main():
            root = tk.Tk()
            my_app = MyWindow(root)
            my_app.pack(side=tk.TOP)
            root.mainloop()


if __name__ == '__main__':
        main()
den error siehst du / seht ihr im post davor aber ich poste ihn nochmal rein:

Traceback (most recent call last):
File "C:/Users/Schlitza/AppData/Local/Programs/Python/Python36-32/forum py3x.py", line 30, in <module>
main()
NameError: name 'main' is not defined

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:34
von narpfel
Bitte poste den Code in Codebox-Tags (Dropdown-Menü „Code auswählen“ direkt über dem Editor-Fenster), ansonsten geht die Einrückung verloren, die bei Python ein wichtiges Syntaxelement ist.

Edit: Okay, das hat sich überschritten. Zwischen dem Code, den du ausgeführt hast, und dem Code von lackschuh gibt es einen Unterschied, der diesen Fehler erzeugt.

Re: GUI mit tkinter und json random auswählen lassen

Verfasst: Donnerstag 11. Januar 2018, 16:35
von Schlitzaaa
narpfel hat geschrieben:Bitte poste den Code in Codebox-Tags (Dropdown-Menü „Code auswählen“ direkt über dem Editor-Fenster), ansonsten geht die Einrückung verloren, die bei Python ein wichtiges Syntaxelement ist.
grade festgestellt und erledigt tut mir leid wusste nicht, dass dies extra gemacht wird :)

könnte das evlt sein das ich durch copy am anfang der zeilen blank space hatte und die entfernt habe ? habe zwar pep8 benutzt und geschaut das keine error in pep8 auftauchen