Tkinter-Fenster und 2 if-Befehle

Fragen zu Tkinter.
Antworten
solver
User
Beiträge: 7
Registriert: Freitag 19. Januar 2018, 20:43

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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
solver
User
Beiträge: 7
Registriert: Freitag 19. Januar 2018, 20:43

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@ 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:
Take it easy Mates!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
solver
User
Beiträge: 7
Registriert: Freitag 19. Januar 2018, 20:43

@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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
solver
User
Beiträge: 7
Registriert: Freitag 19. Januar 2018, 20:43

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Grundlagen lernen ist auf jeden Fall eine gute Idee.
Antworten