Hilfe beim Implementieren eines Tests

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Hallo,

Ich möchte einen Test schreiben: zufällige int Zahlen im Intervall 1-9 werden auf einer GUI einzeln, zentriert angezeigt aber in der position wechselnd, in randomisierter Schriftgröße, für 250 ms. Danach hat man für 900ms die Chance, spacebar zu drücken. Drückt man nicht oder während eine 3 kommt kriegt man einen Fehler. Alles endet nach 900 Zahlen.
Ich habe es mit Tkinter probiert aber bin gescheitert - ich weiß nicht, ob ich buttons oder label nehmen sollte, wie man beliebig platzieren kann, und wie man die zeitspanne zum enter drücken implementiert. Kann mir jemand helfen indem er mir entweder nützliche links sendet, oder mir das hinschreibt? Es ist nicht für eine Hausaufgabe sondern rein aus persönlichem interesse :)

Danke!
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Für Grafiken benutzt man bei tkinter ein Canvas. Und für Zeitintervalle after.
Auf die Leertaste kann man mit bind reagieren.
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Hallo,

Danke für deine Hilfe! ich kriege hierfür "name 'Canvas' is not defined" und weiß nicht warum. Hast du eine Idee?

Code: Alles auswählen

import random
def generate_number():
    list = ["1","2","3","4","5","6","7","8","9"]
    number = random.choice(list)
    return number

import tkinter as tk
root = tk.Tk()
canvas = Canvas(root, height=1000, width=1600,bg=grey)
create_text(400,800,text=str(generate_number()))
root.pack()
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Canvas kommt wie Tk aus dem Paket tkinter. Es muss also `tk.Canvas` heißen.

Code: Alles auswählen

import random
import tkinter as tk 
def generate_number():
    return random.randint(1, 9)

def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, height=1000, width=1600,bg=grey)
    text = canvas.create_text(400,800, text=str(generate_number()))
    canvas.pack()
    root.mainloop()

if __name__ == "__main__":
    main()
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Danke!
ich habe hiermit gearbeitet und nicht darüber nachgedacht. https://tkdocs.com/tutorial/canvas.html
Ich versuche jetzt die Nummer irgendwo randomisiert aber im zentrum anzuzeigen aber ich weiß nicht, wie das geht. Ich habe das hier probiert und sehe überhaupt nichts.

Code: Alles auswählen

import random
import tkinter as tk
def generate_number():
    return random.randint(1, 9)

def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, height=1000, width=1600,background='gray75')
    text = canvas.create_text(400,800, text=str(generate_number()))
    canvas.pack()
    # es ist nichts sichtbar
    number_display = tk.Label(root,height=100,width=200,text=str(generate_number))
    number_display.pack()
    root.mainloop()


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum ein Label? Du hast Du die zwei Koordinaten 400,800, mit denen Du genau einstellen kannst, wo der Text erscheinen soll.
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Ich habe es erst mit tk.Text() probiert, aber es wurde nichts angezeigt.

Code: Alles auswählen

import random
import tkinter as tk
def generate_number():
    return random.randint(1, 9)

def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, height=1000, width=1600,background='gray75')
    text = canvas.create_text(400,800, text=str(generate_number()))
    canvas.pack()
    number_display = tk.Text(root,height=400,width=800)
    number_display.pack()
    number_display.insert(tk.END, str(generate_number()))
    root.mainloop()


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum hast Du jetzt auch noch tk.Text? Das ist doch ein Eingabefeld.
Benutze ein Canvas, so wie Du es schon machst, und da wird schon an der Position 400/800 eine Zahl angezeigt.
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dvdllyyy: Ich kann nicht nachvollziehen das beim vorletzten Versuch nichts sichtbar sein soll. Da wird bei mir an der angegebenen Position eine Ziffer angezeigt.

`number_display` macht nicht so wirklich Sinn, vor allem nicht das da eine *andere* Zahl ausgewürfelt wird als die auf dem Canvas (wenn man die Funktion aufrufen würde).

Für das fernere Ziel das im ersten Beitrag beschrieben ist, würde ich den Text auf dem Canvas auch erst einmal leer erstellen und Zufallsposition, -grösse, und Ziffer in einem extra Schritt konfigurieren, denn diesen Schritt muss man ja mehrfach wiederholen. Da wäre das praktischer das in einer eigenen Funktion zu haben.

Bei nicht-trivialen GUI-Programmen muss man die Sprache bis hin zur objektorientierten Programmierung (OOP) können. Also eigene Klassen entwerfen können. Spätestens wenn man nur unter bestimmten Bedingungen auf den Druck der Leertaste reagieren will, braucht man das, weil man sich dann Zustände über Rückrufe hinweg merken und verändern muss. Und das mit den Klassen würde ich empfehlen erst einmal ohne GUI zu lernen, sonst kommt mit GUIs noch die ereignisbasierte Programmierung extra dazu.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Also bei mir wird nur ein graues fenster angezeigt, egal ob ich canvas.pack() oder auch number_display.pack() ausführe. Ich denke ich lasse es besser bleiben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bekomme auch ein graues und sehr grosses(!) Fenster, was dank 4K-Monitor aber ok geht. Und irgendwo links unten eine kleine Zahl. Mit genau dem Code oben, weniger dem ueberfluessigen number_display.
dvdllyyy
User
Beiträge: 6
Registriert: Sonntag 11. Februar 2024, 20:14

Ich weiß nicht wie man Bilder hier einfügt, aber ich kriege ein graues Fenster ohne Zahl in der Ecke.
Hier ist der code:

Code: Alles auswählen

import random
import tkinter as tk
def generate_number():
    return random.randint(1, 9)

def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, height=1000, width=1600,background='gray75')
    text = canvas.create_text(400,800, text=str(generate_number()))
    canvas.pack()
    root.mainloop()


if __name__ == "__main__":
    main()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bilder auf imgur hochladen & mit der "Get share links"-Option einen Forums-Link erzeugen. Und so sieht das dann aus, genau dein Programm:

Bild
Antworten