Seite 1 von 1

Tkinter-Fenster und 2 if-Befehle

Verfasst: Freitag 19. Januar 2018, 22:24
von solver
Hallo,
ich bin neu im Forum, stehe gerade vor einem kleinen Problem mit Tkinter und hoffe, dass ihr mir weiterhelft.

Mein Programm soll ein Tkinter-Fenster zeigen und dann zwei if-Befehle ausführen. Das Tkinter-Fenster bekomme ich aber nicht zu sehen. Woran kann das liegen?

Hier der Code:

Code: Alles auswählen

from tkinter import *
size=500
window=Tk()

a=1

if a == 1:
    print('a=1')
    if input() == ('b'):
        print('b')

Ich bedanke mich für eure Hilfe im Voraus.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Freitag 19. Januar 2018, 22:30
von kbr
@solver: So einfach ist das nicht. GUIs sind komplexe Biester mit Event-Loops und Callbacks. Hier findest Du eine gute Dokumentation zu tkinter: http://infohost.nmt.edu/tcc/help/pubs/t ... index.html

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Freitag 19. Januar 2018, 22:37
von wuf
Hi solver

So sollte es funktionieren:

Code: Alles auswählen

from tkinter import *
size=500
window=Tk()
window.geometry("{}x{}".format(size, size))

a=1

if a == 1:
    print('a=1')
    if input() == ('b'):
        print('b')

window.mainloop()
Gruss wuf :wink:

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Freitag 19. Januar 2018, 23:03
von solver
Danke für die Antworten.

Ich habe gerade folgendes festgestellt:
Das Tkinter-Fenster wird mir angezeigt. :oops:
Aber erst nachdem 'b' eingegeben wurde. (Habe es erst nicht gesehen, weil das Fenster verdeckt war.)

Aber ich will ja eigentlich, dass das Tk-Fenster die ganze Zeit angezeigt wird.

@wuf: Ich habe deinen Code eingegeben. Ist aber das Gleiche. Das Tk-Fenster ist erst zu sehen, wenn ich 'b' eingegeben habe.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 01:27
von wuf
@ solver
Die Anweisung input() solltest du nur für ein Skript ohne Tk-GUI verwenden. Sie hält die weitere Abarbeitung des Skriptes auf bis eine Eingabe erfolgt ist.

Bei einer Tk-GUI gibt es verschiedene Möglichkeiten. Meine Lösung für eine einmalige Abfrage der Taste 'b' nach Erfüllung der Bedingung a == 1 wäre:

Code: Alles auswählen

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

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

SIZE=500


def key_b_callback(event):
    print("Die Taste 'b' wurde gedrückt!")
    window.unbind('<b>')
    
window=tk.Tk()
window.geometry("{}x{}".format(SIZE, SIZE))

a=1

if a == 1:
    print('a=1')
    window.bind('<b>', key_b_callback)

window.mainloop()
Gruss wuf :wink:

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 10:41
von Sirius3
@solver: wenn Du nicht schreibst, was Du wirklich willst, kann man Dir schlecht helfen. Das Beispiel macht so ja keinen Sinn und es ist nicht wirklich ersichtlich daraus, was Dein eigentliches Problem ist.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 13:58
von solver
@sirius: Ich kann mein Problem leider noch nicht so gut formulieren, weil es mir noch an Fachbegriffen fehlt - Anfängerproblem halt. Mit der Hilfe anderer Programmierer kann ich aber auch die Fachbegriffe lernen und meine Fragen in Zukunft eindeutiger formulieren.

Vielen Dank für eure Geduld.

@wuf: Mit dem zweiten Code von dir konnte ich das Problem lösen. Das Fenster wird angezeigt, sobald das Programm gestartet wurde. Das war mein Ziel. Vielen Dank.

Mein Ziel ist ein Programm, das ein Labyrinth anzeigt und eine Figur, die man durch die Pfeiltasten (oder die Tasten w a s d) durch das Labyrinth bewegen muss. Das Labyrinth und die Figur könnte ich in Tkinter darstellen. Die Wände des Labyrinths könnten aus Rechtecken bestehen. Die Figur muss dann die Wände erkennen und sich nicht durch sie hindurch bewegen können.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 17:33
von Sirius3
@solver: jetzt hast Du ja doch schreiben können, was Du möchtest, und da ist wufs Ansatz mit »bind« auch gar nicht so verkehrt. Nur eben das `if a == 1` macht keinen Sinn, da Du ja auf 4 Tasten reagieren willst, immer und nicht nur einmal.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 20:26
von solver
So sieht der Code von meinem Programm bis jetzt aus.

Code: Alles auswählen

#rx1 bedeutet Rand, x-wert der linken oberen ecke
rx1=0
ry1=0
rx2=500
ry2=0
rx3=500
ry3=500
rx4=0
ry4=500

#rax1 bedeutet Regal a, X-wert der linken oberen ecke
rax1=100
ray1=100
rax3=400
ray3=400

from tkinter import *
size=500
window = Tk()
a = Canvas(window, width=size, height=size)

xc=0
yc=0
m=1 
step=4

x1=0
y1=0
x3=25
y3=25

Richtung = 'ym'

#x1 ist der x-wert der linken oberen Ecke der Figur

if step == 4:
    print('step = 4')
    Figur = a.create_rectangle(x1, y1, x3, y3, fill='black')
    step = 1

if step == 1:
    print('step = 1')
    if input() == ('w'): #diese Zeile verhindert anscheinend, 
        print('w')       #dass das tkinter-Fenster angezeigt wird
        Richtung = 'ym'  #oder lässt es verschwinden, bevor man es sehen kann
        step = 2

    if input() == ('a'):
        Richtung = 'xm'
        step = 2

    if input() == ('s'):
        Richtung = 'yp'
        step = 2

    if input() == ('d'):
        Richtung = 'xp'
        step = 2

if step == 2:
    print('step = 2')
    if Richtung == 'ym':
        xw = xc
        yw = yc - 25
        step = 3
    
#Berechne den neuen y-Wert

#Wenn in der aktuellen Richtung ein Hindernis ist, ist m = steh

if step == 3:
    print('step = 3')
    if xw < x1 or x > x3 or y < y1 or y > y3 or xw > rax1 and x < rax3 and y > ray1 and y < ray3:
        m = 2 
        step = 1

else:
    x1
    step = 4

#wo muss das hin?
if m == 2: 
    step = 1

if m == 1: 
    step = 4

Dass da einiges nicht funktionieren kann, kann ich mir jetzt vorstellen.
Wenn Tkinter mit dem Befehl input() nicht umgehen kann, dann sind in meinem aktuellen Code wahrscheinlich noch viele Befehle, bei denen das auch so ist.
Die Idee, Tkinter zu verwenden habe ich durch ein Einsteiger-Lehrbuch bekommen. Dort werden die key-Befehle verwendet. Da ich diese noch nicht verstehe, habe ich stattdessen den input()-Befehl verwendet.
Jetzt denke ich nach, wie ich weiter mache. Entweder ich lese erst mal mehr über Tkinter, welche Befehle verwendet werden dürfen. Oder ich beschäftige mich erst mal mit den totalen Grundlagen. Vielleicht ist das deutsche Python-Tutorial da geeignet. Außerdem habe ich mir die soloLearn-App installiert, die an anderer Stelle im Forum empfohlen wurde.

Die Frage bei meinem Labyrinth-Programm wäre jetzt, wo all die für mich neuen Befehle hingehören. Nun ja, ich habe noch viel zu lernen. Werde gleich mal mit dem Lesen anfangen.

Re: Tkinter-Fenster und 2 if-Befehle

Verfasst: Samstag 20. Januar 2018, 22:58
von Sirius3
Grundlagen lernen ist auf jeden Fall eine gute Idee.