Seite 2 von 2

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

Verfasst: Donnerstag 11. Januar 2018, 16:38
von kbr
@Schlitzaaa: Du bist ein Opfer der Copy & Paste Programmierung. Gehe nochmal die Formatierung durch, dann findest Du den Fehler.

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

Verfasst: Donnerstag 11. Januar 2018, 16:41
von Schlitzaaa
kbr hat geschrieben:@Schlitzaaa: Du bist ein Opfer der Copy & Paste Programmierung. Gehe nochmal die Formatierung durch, dann findest Du den Fehler.
bin schon dabei gib mir bitte ne sekunde xD

hab alles klappt so neuer comment neuer error ohje tut mir leid

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

Verfasst: Donnerstag 11. Januar 2018, 16:44
von wuf
Hi Schlitzaaa

Hier auch noch was zum herumspielen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import random

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Sprücheklopfer"
APP_XPOS = 50
APP_YPOS = 100
APP_WIDTH = 800
APP_HEIGHT = 50

        
class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title(APP_TITLE)
    
    def build(self):
        self.protocol("WM_DELETE_WINDOW", self.close_app)
        self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
        #self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
        self.option_add("*Button.highlightThickness", 0)

        self.app_container_01 = tk.Frame(self)
        self.app_container_01.pack(fill='both', expand=True)
        
        self.my_label = tk.Label(self.app_container_01)
        self.my_label.pack(expand=True, padx=5)
    
        self.json_data = self.read_json_file()
        self.update_label(self.json_data)
         
    def read_json_file(self):
        with open('test.json') as json_data:
            data = json.load(json_data)
        return data
        
    def update_label(self, data):
        self.my_label['text'] = random.choice(self.json_data[u'sprüche'])
        self.after(1000, self.update_label, data)
        
    def close_app(self):
        # Here do something before apps shutdown
        print("Good Bye!")
        self.destroy()

        
def main():        
    app = Application()
    app.build()
    app.mainloop()

    
if __name__ == '__main__':
    main()      
 
Gruss wuf :wink:

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

Verfasst: Donnerstag 11. Januar 2018, 16:45
von Schlitzaaa
so also neuer error:

ERROR:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Schlitza\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:\Users\Schlitza\Documents\info mit notepad.py", line 19, in read_json_file
data = json.load(json_data)
File "C:\Users\Schlitza\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 299, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Users\Schlitza\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\Schlitza\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\Schlitza\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 3 column 9 (char 24)

CODE:

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:46
von Schlitzaaa
wuf hat geschrieben:Hi Schlitzaaa

Hier auch noch was zum herumspielen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import random

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Sprücheklopfer"
APP_XPOS = 50
APP_YPOS = 100
APP_WIDTH = 800
APP_HEIGHT = 50

        
class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title(APP_TITLE)
    
    def build(self):
        self.protocol("WM_DELETE_WINDOW", self.close_app)
        self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
        #self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
        self.option_add("*Button.highlightThickness", 0)

        self.app_container_01 = tk.Frame(self)
        self.app_container_01.pack(fill='both', expand=True)
        
        self.my_label = tk.Label(self.app_container_01)
        self.my_label.pack(expand=True, padx=5)
    
        self.json_data = self.read_json_file()
        self.update_label(self.json_data)
         
    def read_json_file(self):
        with open('test.json') as json_data:
            data = json.load(json_data)
        return data
        
    def update_label(self, data):
        self.my_label['text'] = random.choice(self.json_data[u'sprüche'])
        self.after(1000, self.update_label, data)
        
    def close_app(self):
        # Here do something before apps shutdown
        print("Good Bye!")
        self.destroy()

        
def main():        
    app = Application()
    app.build()
    app.mainloop()

    
if __name__ == '__main__':
    main()      
 
Gruss wuf :wink:
ehem wuf danke dir aber naja wtf ?! :D ohje ich schlaf heut nacht nichtmehr :D

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

Verfasst: Donnerstag 11. Januar 2018, 16:54
von __deets__
Dein Problem ist jetzt eine fehlerhafte JSON Datei.

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

Verfasst: Donnerstag 11. Januar 2018, 16:57
von Schlitzaaa
__deets__ hat geschrieben:Dein Problem ist jetzt eine fehlerhafte JSON Datei.
okey deets ehem naja das geschriebene der json sind eben nur sprüche

Code: Alles auswählen

{
    "sprüche":[
        "Wer von seinem Tag nicht zwei Drittel für sich selbst hat, ist ein Sklave.",
        "Herr Jenrich ist der Coooooolste ;)",
		"Wer von seinem Tag nicht zwei Drittel für sich selbst hat, ist ein Sklave.",
        "Jeder Tag, an dem du nicht lächelst, ist ein verlorener Tag.",
        "Wenn du die Absicht hast, dich zu erneuern, tu es jeden Tag.",
        "Bei Tage ist es kinderleicht, die Dinge nüchtern und unsentimental zu sehen. Nachts ist das eine ganz andere Geschichte",
        "Die Tage werden unterschieden, aber die Nacht hat einen einzigen Namen",
        "Gib jedem Tag die Chance, der schönste deines Lebens zu werden.",
        "Geduld ist das Vertrauen, dass alles dann passiert, wenn die Zeit dafür reif ist.",
        "Es ist kein Anzeichen von seelischer Gesundheit sich an eine zutiefst gestörte Gesellschaft anpassen zu können.",
        "Einen Schuss Verrücktheit braucht jeder von uns, sonst trifft uns die Normalität mit voller Wucht …",
        "Die Erfahrung ist wie die Sonne: sie lässt die Blüten welken, aber die Früchte reifen.",
        "Der Weg ist das Ziel.",
        "Bleib daheim.",
        "Wenn das Glück kommt, muss man ihm einen Stuhl hinstellen.",
        "Man hört nicht auf zu lachen, wenn man alt wird, aber man wird alt, wenn man aufhört zu lachen.",
        "Das Glück kommt zu denen, die lachen.",
        "Ein paar Minuten Träumen, ist wie ein Geschenk, das man sich selbst macht.",
        "Wenn die Augen das Tor zur Seele sind, dann sind die Ohren der Geheimgang.",
        "Zeit ist das Rohmaterial, aus dem wir unser Leben formen.",
        "Unsere Träume können wir erst dann verwirklichen, wenn wir uns entschließen einmal daraus zu erwachen.",
        "Kämpfe um das, was Dich weiter bringt. Akzeptiere das, was Du nicht ändern kannst. Und trenne Dich von dem, was Dich runterzieht.",
        "Menschen, die wir lieben, bleiben für immer, denn sie hinterlassen Spuren in unseren Herzen.",
        "Humor ist der Knopf, der verhindert, dass uns der Kragen platzt.",
        "Auch in einer Träne kann sich die Sonne spiegeln.",
        "Freunde sind Familie, die man sich aussucht!",
        "Freunde sind Menschen die in der Vergangenheit zu dir standen, in der Gegenwart dir vertrauen werden und in der Zukunft dir helfen werden.",
        "Gott schuf die Zeit, von Eile hat er nichts gesagt.",
        "Vertrauen ist eine Oase des Herzens, die von der Karawane des Denkens nie erreicht wird.",
        "Liebe ist der Entschluss, das Ganze eines Menschen zu bejahen, die Einzelheiten mögen sein, wie sie wollen.",
        "in unserer Freundschaft werden alle Gedanken, alle Wünsche, alle Erwartungen ohne Worte geboren und geteilt, mit Freude, die keinen Beifall braucht.",
        "Freundschaft ist Ich-Erweiterung. Sie wirft Licht; sie gibt Halt; sie hält den Spiegel vor; sie erzieht; sie lebt aus Glauben und Treue; sie atmet im Gespräch.",
        "Freundschaft ist eine Tür zwischen zwei Menschen. Sie kann manchmal knarren, sie kann klemmen, aber sie ist nie verschlossen.",
        "So mancher sagt so leicht dahin, der Unsinn hätte keinen Sinn. Doch wo der Unsinn waltet, da sind die Sorgen ausgeschaltet. Und Sorgenfrei leben ist ein Gewinn, drum hat der Unsinn seinen Sinn.",
        "Warte nicht auf das grosse Wunder, sonst verpasst du die vielen kleinen!",
        "Auch aus Steinen,die einem in den Weg gelegt werden,kann man Schönes bauen.",
        "Ein Tropfen Liebe ist mehr, als ein Ozean an Wille und Verstand.",
        "Erst in der Finsternis kann man das Licht erkennen, das ein jeder von uns in sich trägt.",
        "Das schönste an einer Freundschaft ist nicht die ausgestreckte Hand, das freundliche Lächeln oder der menschliche Kontakt, sondern das erhebende Gefühl, jemanden zu haben, der an einen glaubt und sein Vertrauen schenkt!",
        "Die größten Ereignisse, das sind nicht unsere lautesten, sondern unsre stillsten Stunden.",
        "Viele Leute bringen mich zum lachen, aber Du bist die einzigste Person, die es ohne Worte schafft.",
        "Nicht da ist man daheim, wo man seinen Wohnsitz hat, sondern wo man verstanden wird.",
        "Du kannst Dein Leben nicht verlängern und Du kannst es auch nicht verbreitern. Aber Du kannst es vertiefen!",
        "Freundinnen sind wie Schuhe: Wenn man jung ist kann man nicht genug davon haben; später stellt man fest, dass es immer die gleichen sind, mit denen man sich wohlfühlt."
    ]
}
sry kp ob das in nen /code soll oder nicht

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

Verfasst: Donnerstag 11. Januar 2018, 17:01
von narpfel
Ist dein JSON UTF-8-kodiert?

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

Verfasst: Donnerstag 11. Januar 2018, 17:03
von Schlitzaaa
narpfel hat geschrieben:Ist dein JSON UTF-8-kodiert?
omg ich hab gerade nachgeguckt :D dann kam dein post und der hat mich bestärkt
es war zwar uft-8 kodiert aber nicht ohne BOM das hats jz rausgerissen es funktioniert !

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

Verfasst: Donnerstag 11. Januar 2018, 17:05
von Schlitzaaa
Dankeschön an alle es Funktioniert ! :)
Ich danke euch von herzen !

ein letztes noch :) könnte mir vllt jmd erklären was der 'if' block und der 'main' block sowie der 'init' block in
dem code genau machen ? also in folgendem bsp. von lackschuh.

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('sprüche2.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, 17:37
von narpfel
`main` ist einfach eine ganz normale Funktion. Die hätte man auch `start_program` oder `foo` nennen können, aber `main` ist der übliche Name für die Funktion, die als erstes aufgerufen wird und in der das Programm abläuft.

`if __name__ == "__main__":`ist dazu da, `main` nur dann aufzurufen, wenn die Python-Datei als Programm gestartet wird und nicht importiert. Das ist hier beschrieben.

`__init__` ist der Initialisierer der `MyWindow`-Klasse. Das ist unter anderem im Python-Tutorial beschrieben.

@lackschuh: Findest du es sinnvoll, fertige Lösungen für Hausaufgaben zu posten?

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

Verfasst: Donnerstag 11. Januar 2018, 17:54
von Schlitzaaa
narpfel hat geschrieben:`main` ist einfach eine ganz normale Funktion. Die hätte man auch `start_program` oder `foo` nennen können, aber `main` ist der übliche Name für die Funktion, die als erstes aufgerufen wird und in der das Programm abläuft.

`if __name__ == "__main__":`ist dazu da, `main` nur dann aufzurufen, wenn die Python-Datei als Programm gestartet wird und nicht importiert. Das ist hier beschrieben.

`__init__` ist der Initialisierer der `MyWindow`-Klasse. Das ist unter anderem im Python-Tutorial beschrieben.

@lackschuh: Findest du es sinnvoll, fertige Lösungen für Hausaufgaben zu posten?
Erstmal danke für die erklärungen. :)

Zu den Hausaufgaben:
Ich kann dir hier mehrere verschiedene Versuche reinposten
weißte was ich mach einfach mal 2 rein.

Code: Alles auswählen

import tkinter
from tkinter import *
import random
import json
fenster = tkinter.Tk()
fenster.geometry("600x400")
fenster.title("Sprüche für jeden Tag")


class hauptteil():
    def Button():
        listbox.insert(END, "button pressed")

def set_text():
    text.config(text=random.choice(examples))


button = Button(fenster, text='Test', command=set_text)
button.pack()


with open('jokes.json', encoding='utf-8') as json_data:
    data = json.load(json_data)
    jokes = data['sprüche']


text = Message(fenster, width=300)
text.pack()
fenster = hauptteil()
fenster.mainloop()

Code: Alles auswählen

import tkinter as tk

top = tkinter.Tk()
from random import randint

import json

with open('jokes.json') as json_data:
    data = json.load(json_data)
    jokes = data['jokes']


counter = 0 
def counter_label(label):
  counter = 0
  def count():
    global counter
    counter += 1
    label.config(text=str(counter))
    label.after(1000, count)
  count()
 
 
root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="dark green")
label.pack()
counter_label(label)
button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()
weiter im Text.
Die Hausaufgabe war nicht gestellt von wegen ja macht ein gui mit random Sprüchen. Nein.
Es hieß programmiert ein Gui das etwas kann.
Nun hatte ich mir das mit dem Random in den kopf gesetzt und musste es einfach umsetzen.
zudem bin ich perfektionist und habe mich jz weiterbelesen was die visuelle darstellung von Guis angeht und es ein wenig aufgehübscht.
Wenn man das so sagen kann.
ich saß jz 1,5 wochen an der HA und habe es nicht hinbekommen da darf ich mir doch wohl hilfe holen oder ?

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

Verfasst: Donnerstag 11. Januar 2018, 18:10
von narpfel
@Schlitzaaa: Natürlich kannst du hier nachfragen, wenn du Probleme hast, die du nicht alleine lösen kannst (auch bei Hausaufgaben). Dabei gilt (wie immer): Konkrete Fragen helfen dir, gute (und hilfreiche) Antworten zu bekommen.

Mein Frage war an lackschuh gerichtet, weil er dir eine fertige Lösung gegeben hat.

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

Verfasst: Donnerstag 11. Januar 2018, 18:47
von Schlitzaaa
narpfel hat geschrieben:@Schlitzaaa: Natürlich kannst du hier nachfragen, wenn du Probleme hast, die du nicht alleine lösen kannst (auch bei Hausaufgaben). Dabei gilt (wie immer): Konkrete Fragen helfen dir, gute (und hilfreiche) Antworten zu bekommen.

Mein Frage war an lackschuh gerichtet, weil er dir eine fertige Lösung gegeben hat.
Ich weiß aber ich muss sagen dass das gut so war zumindest für mich ^^.
Zudem ist zu erwähnen das ich mich selbst darüber gewundert habe
und ich denke, dass lackschuh sich dachte das ich ewig dransitze und es nicht hinbekomme und
er hat mir deshalb die lösung geschickt

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

Verfasst: Sonntag 14. Januar 2018, 23:19
von Schlitzaaa
wuf hat geschrieben:Hi Schlitzaaa

Hier auch noch was zum herumspielen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import random

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Sprücheklopfer"
APP_XPOS = 50
APP_YPOS = 100
APP_WIDTH = 800
APP_HEIGHT = 50

        
class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title(APP_TITLE)
    
    def build(self):
        self.protocol("WM_DELETE_WINDOW", self.close_app)
        self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
        #self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
        self.option_add("*Button.highlightThickness", 0)

        self.app_container_01 = tk.Frame(self)
        self.app_container_01.pack(fill='both', expand=True)
        
        self.my_label = tk.Label(self.app_container_01)
        self.my_label.pack(expand=True, padx=5)
    
        self.json_data = self.read_json_file()
        self.update_label(self.json_data)
         
    def read_json_file(self):
        with open('test.json') as json_data:
            data = json.load(json_data)
        return data
        
    def update_label(self, data):
        self.my_label['text'] = random.choice(self.json_data[u'sprüche'])
        self.after(1000, self.update_label, data)
        
    def close_app(self):
        # Here do something before apps shutdown
        print("Good Bye!")
        self.destroy()

        
def main():        
    app = Application()
    app.build()
    app.mainloop()

    
if __name__ == '__main__':
    main()      
 
Gruss wuf :wink:
habs zum laufen gebracht hase :D
aber auf was bezieht sich in build die self.geometry kette ?

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

Verfasst: Montag 15. Januar 2018, 09:28
von Kniffte
@Schlitzaaa:

Code: Alles auswählen

self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
'--> Definiert die Startposition des Applikationfensters

Code: Alles auswählen

self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
'--> Definiert die Größe des Applikationfensters

Kann man auch als Einzeiler schreiben:

Code: Alles auswählen

self.geometry("{}x{}+{}+{}".format(APP_WIDTH, APP_HEIGHT, APP_XPOS, APP_YPOS))

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

Verfasst: Montag 15. Januar 2018, 10:19
von wuf
Schlitzaaa hat geschrieben:habs zum laufen gebracht hase :D
aber auf was bezieht sich in build die self.geometry kette ?
Super!

Was die beiden Zeilen bewirken hat Kniffte schon ausführlich erklärt. Habe diese standardmässig für Versuchszwecke in meiner Testskript-Vorlage integriert. Können normalerweise aber auskommentiert bleiben. Manchmal braucht es aber beim experimentieren eine eigene Position und oder Grösse des Hauptfensters, welche einem nicht vom OS-Manager vorgeschrieben wird. Du kannst natürlich Positionierung und Grösse in einer Zeile vereinen wie Kniffte erwähnte.

Gruss wuf :wink: