GUI mit tkinter und json random auswählen lassen

Fragen zu Tkinter.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

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()
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

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.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@narpfel
Stimmt. Jetzt wo du es sagst ;)

examples ist nicht definiert und

Code: Alles auswählen

fenster = hauptteil()
fenster.mainloop()
ist auch falsch.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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 :))
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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 ^^
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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 ?
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

hmmm er gibt mir nen error von wegen 'MyWindow' is not defined
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Wo ist `MyWindow` denn definiert und wo wird es verwendet?
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

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()
 
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@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).
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

__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
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Schlitzaaa: Der Traceback passt zu keinem der beiden Programme, die lackschuh gepostet hat. Zeige bitte den Code, den du ausführst.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

__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
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

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.
Zuletzt geändert von narpfel am Donnerstag 11. Januar 2018, 16:35, insgesamt 1-mal geändert.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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
Antworten