Button löschen

Fragen zu Tkinter.
Antworten
Benutzeravatar
ixaM
User
Beiträge: 13
Registriert: Samstag 9. Juli 2016, 15:32
Wohnort: Nähe München

Samstag 9. Juli 2016, 15:36

Code: Alles auswählen

from tkinter import *
def delete_button(event):
    global deletebutton
    deletebutton = event.widget.pack_forget()

def Steinmine_bauen():
    global abc
    abc = abc
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    b1.bind('<Button-1>', delete_button)
    b2.bind('<Button-1>', delete_button)
    b3.bind('<Button-1>', delete_button)
    b4.bind('<Button-1>', delete_button)
    b5.bind('<Button-1>', delete_button)
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    b5.pack()
    master.mainloop()
    
def Goldmine_bauen():
    global abc
    abc = abc
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    b1.bind('<Button-1>', delete_button)
    b2.bind('<Button-1>', delete_button)
    b3.bind('<Button-1>', delete_button)
    b4.bind('<Button-1>', delete_button)
    b5.bind('<Button-1>', delete_button)
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    b5.pack()
    master.mainloop()

def Eisenerzmine_bauen():
    global abc
    abc = abc
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    b1.bind('<Button-1>', delete_button)
    b2.bind('<Button-1>', delete_button)
    b3.bind('<Button-1>', delete_button)
    b4.bind('<Button-1>', delete_button)
    b5.bind('<Button-1>', delete_button)
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    b5.pack()
    master.mainloop()

def Kohlemine_bauen():
    global abc
    abc = abc
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    b1.bind('<Button-1>', delete_button)
    b2.bind('<Button-1>', delete_button)
    b3.bind('<Button-1>', delete_button)
    b4.bind('<Button-1>', delete_button)    
    b5.bind('<Button-1>', delete_button)
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    b5.pack()
    master.mainloop()

def Holzfäller_bauen():
    global abc
    abc = abc
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    b1.bind('<Button-1>', delete_button)
    b2.bind('<Button-1>', delete_button)
    b3.bind('<Button-1>', delete_button)
    b4.bind('<Button-1>', delete_button)
    b5.bind('<Button-1>', delete_button)
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    b5.pack()
    master.mainloop()

def Kreis_move_right():
    w.delete(Kreis)
    global x1
    global x2
    x1 = x1 + 5
    x2 = x2 + 5
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")
    
def Kreis_move_left():
    w.delete(Kreis)
    global x1
    global x2
    x1 = x1 - 5
    x2 = x2 - 5
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")

def Kreis_move_bot():
    w.delete(Kreis)
    global y1
    global y2
    y1 = y1 + 5
    y2 = y2 + 5
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")

def Kreis_move_top():
    w.delete(Kreis)
    global y1
    global y2
    y1 = y1 - 5
    y2 = y2 - 5
    global Kreis
    Kreis = w.create_oval(x1,y1,x2,y2, fill = "red")

abc = 0
x1 = 0
y1 = 0
x2 = 100
y2 = 100
master = Tk()
w = Canvas(master, width=1000, height=1000)
w.create_rectangle(0, 0, 1000,1000, fill="green")
w.pack(side = "left")
b1 = Button (text = "Steinmine", command = Steinmine_bauen)
b1.pack()
b2 = Button (text = "Goldmine", command = Goldmine_bauen)
b2.pack()
b3 = Button (text = "Eisenmine", command = Eisenerzmine_bauen)
b3.pack()
b4 = Button (text = "Kohlemine", command = Kohlemine_bauen)
b4.pack()
b5 = Button (text = "Holzfäller", command = Holzfäller_bauen)
b5.pack()
if abc == abc: 
    moveR = Button (text = "Rechts", command = Kreis_move_right)
    moveR.pack(side = "right")
    moveL = Button (text = "Links", command = Kreis_move_left)
    moveL.pack(side = "right")
    moveT = Button (text = "Oben", command = Kreis_move_top)
    moveT.pack(side = "right")
    moveB = Button (text = "Unten", command = Kreis_move_bot)
    moveB.pack(side = "right")
Ich möchte, dass nach dem Drücken eines der oberen Buttons sowohl "Stein" -, "Gold" -, "Eisen" -, und "Kohlemine", wie auch "Holzfäller" verschwinden. Dies passiert jedoch stand jetzt erst nach erneutem Drücken der Buttons. Irgendwelche Vorschläge? :)
Sirius3
User
Beiträge: 8799
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 9. Juli 2016, 18:11

@ixaM: Dein Programm macht genau das, was Du geschrieben hast, Du bindest ein neues Kommando (delete_button) an Deine Knöpfe, so dass sie beim nächsten Klick verschwinden.

Wenn Du anfängst, Variablennamen durchzunummerieren, willst Du eigentlich eine Liste verwenden. Auch machen viele Funktionen genau oder ungefähr das selbe. Du kannst das vermeiden, indem Du die Unterschiede durch Argumente der Funktionen ausdrückst und beim Aufruf diese Argumente angibst.

Der Sinn von abc erschließt sich mir nicht wirklich. Sternchenimporte solltest Du nicht verwenden, weil Du nicht kontrollieren kannst, was da alles in Deinen Namensraum importiert wird.

global solltest Du nicht verwenden. Das macht größere Programme undurchsichtig. Wobei ich Dein Programm schon als „größer“ bezeichnen würde. Die Lösung ist Klassen zu verwenden:

Code: Alles auswählen

import tkinter as tk
from functools import partial

BUTTON_NAMES = [
    "Steinmine",
    "Goldmine",
    "Eisenmine",
    "Kohlemine",
    "Holzfäller",
]

def create_buttons(frame, names, command):
    buttons = []
    for name in names:
        b = tk.Button(frame, text=name, command=command)
        b.pack()
        buttons.append(b)
    return buttons

def remove_buttons(buttons):
    while buttons:
        buttons.pop().pack_forget()

class Game(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.buttons = create_buttons(self, BUTTON_NAMES, self.built)
        self.field = tk.Canvas(master, width=1000, height=1000)
        self.field.create_rectangle(0, 0, 1000, 1000, fill="green")
        self.field.pack(side = "left")
        for name, delta_x, delta_y in [
            ("Rechts", 5, 0),
            ("Links", -5, 0),
            ("Hoch", 0, -5),
            ("Runter", 0, 5),
        ]:
            move = tk.Button(text=name, command=partial(self.move, delta_x, delta_y))
            move.pack(side="right")
        self.circle = 0
        
    def built(self):
        self.circle = self.field.create_oval(0, 0, 100, 100, fill = "red")
        remove_buttons(self.buttons)
 
    def move(self, delta_x, delta_y):
        pos = self.field.coords(self.circle)
        pos = pos[0] + delta_x, pos[1] + delta_y, pos[2] + delta_x, pos[3] + delta_y
        self.field.coords(self.circle, *pos)

def main():
    master = tk.Tk()
    game = Game(master)
    game.pack()
    master.mainloop()
    
if __name__ == '__main__':
    main()
Benutzeravatar
ixaM
User
Beiträge: 13
Registriert: Samstag 9. Juli 2016, 15:32
Wohnort: Nähe München

Samstag 9. Juli 2016, 19:09

Danke, dass du dir da so viel Mühe gegeben hast :) . Ich hätte nicht erwartet, dass man das Programm auch in halb so lang machen könnte und dabei sogar Einiges verbessern kann. Eine Frage habe ich aber noch:

Kann man die Farbe des im Vordergrund liegenden Körpers (sei es der Hintergrund, ein Rechteck o.Ä) abfragen?
Antworten