textbox und knopf.

Fragen zu Tkinter.
Antworten
_Bamba_
User
Beiträge: 7
Registriert: Samstag 11. Februar 2017, 16:29

Hallo erstmal, ich wollte mit python ein Textpassiertes spiel machen und das mit tkinter.

Also es solle ein Text erscheinen, dann sollen die knöpfe erscheinen und wenn ein knopf gedrückt wird soll ich die TextBox ein anderer Text erschienen. Hoffe ihr versteht was ich meine. :D

Also mein eigentliches Problem ist es das die knöpfe dauerhaft da sind und wenn man einen drückt erscheint der Text unter der anderen TextBox.

Mein bisheriges script:

Code: Alles auswählen

import sys
from tkinter import *
import time

root = Tk()



def text(event):
    T = Text(root, height=30, width=40)
    T.pack()
    quote = ('Hallo, hört mich jemand?')
    T.insert(END, quote)



w1 = Label(root, text='Test1', bg = 'white', fg='black')
w1.pack(padx=5, pady=10, side=LEFT)
w1.bind('<Button-1>',text)

w = Label(root, text='Test 2', bg='white', fg='black')
w.pack(padx=5, pady=20, side=LEFT)
w.bind('<Button-1>',text)

mainloop()
Ich hoffe ihr könnt mir helfen. Python3.6

MFG Bamba
Zuletzt geändert von Anonymous am Donnerstag 23. Februar 2017, 17:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@_Bamba_: Gewöhn Dir am besten so schlechte Namen gar nicht erst an. Einbuchstabige, nichtssagende Namen und dazu auch noch im Ansatz nummieriert ist nicht verständlich. Quelltext wird öfter gelesen als geschrieben, also macht es Sinn beim schreiben darauf zu achten das er leicht zu lesen und zu verstehen ist. Gute Namen tragen dazu sehr stark bei.

`text()` ist kein guter Name für eine Funktion. Funktionen und Methoden werden üblicherweise nach ihrer Tätigkeit benannt, also beispielsweise `add_text()` oder `show_text()`. Beim Namen `text` dagegen vermutet man als Leser das sich dahinter ein Wert versteckt der ein Text *ist*. Also beispielsweise eine Zeichenkette oder irgend ein anderer eher ”passiver” Wert.

Du schreibst im Text von „Knöpfen“ hast im Code aber `Label`-Objekte. Bei einem „Knopf“ hätte ich jetzt eher einen `Button` erwartet.

Sternchenimporte sind Böse™. Damit holt man sich relativ unkontrolliert Namen ins Modul. Bei `tkinter` sogar *sehr viele* Namen. Da sieht man schnell nicht mehr wo eigentlich welcher Name definiert wird, und es besteht auch die Gefahr von Namenskollisionen. Bei `tkinter` wird das Modul üblicherweise als `tk` importiert: ``import tkinter as tk``. Dann hat man nur den Namen `tk` ins Modul geholt, über den man dann alle Namen in dem Modul als Attribute abfragen kann, also beispielsweise ``label = tk.Label()`` statt ``label = Label()``.

Wenn erst der Text im Fenster sein soll, dann musst Du den vor den Knöpfen ins Fenster stecken (wenn ``pack(side=tk.TOP)`` angenommen wird. Verschiedene `pack()`-Richtungen sollte man innerhalb eines Containerwidgets übrigens nicht mischen. Wenn der Text über den Schaltflächen angeordnet werden soll, die Schaltflächen dann aber nebeneinander, dann braucht man für die Schaltflächen einen weiteren Container (`Frame` beispielsweise) in dem man die Schaltflächen nebeneinander packt und den Frame dann unter den `Text`.

Üblicherweise erstellt man am Anfang alle GUI-Elemente und verändert die dann im laufe des Programms. Eine Schaltfläche würde in Deinem Programm dann kein neues `Text`-Objekt erstellen, sondern den Textinhalt in dem bereits zu Beginn erstellten `Text` verändern. Also ersetzen, oder neuen Inhalt hinzufügen beispielsweise.

Um das halbwegs sauber und nachvollziehbar hin zu bekommen, kommt man bei GUIs nicht um objektorientierte Programmierung (OOP) herum.

Den Import von `time` kannst Du bei GUIs im Grunde auch gleich wieder vergessen. Bei GUIs muss die GUI-Hauptschleife laufen. Das heisst Rückruffunktionen/-methoden dürfen immer nur ganz kurz etwas tun und dann zur Hauptschleife von der aus sie aufgerufen wurden, zurückkehren. Solange so eine Methode läuft, reagiert die GUI nämlich nicht mehr.
Antworten