Buttons mit for-Schleife

Fragen zu Tkinter.
Antworten
fencestake
User
Beiträge: 4
Registriert: Sonntag 13. Dezember 2020, 17:13

Hallo zusammen

Ich bin ganz neu hier im Forum und auch noch nicht viel länger am Lernen der Programmiersprache Python.
Ich möchte mehrere Buttons erstellen, die immer wieder die gleichen Eigenschaften (width, height, bg, fg, etc.) haben sollen. Um mir die wiederholte Arbeit zu sparen und eine allfällige Änderung effizienter zu gestalten, dachte ich an eine for-Schleife. Das funktioniert soweit auch:

Code: Alles auswählen

import tkinter

button = ["variable", "operator", "tupel"]

main = tkinter.Tk()

for x in button:
    x = tkinter.Button(main, width=8, height=1, text=x, bg="#2b2b2b", fg="#a9b7c6")
    x.pack()

main.mainloop()
Nun kann es aber vorkommen, dass ich bei einem Button z.B. "height=2" angeben möchte. Leider kann ich mit "variable["text"] nicht darauf zugreifen.
Fehlermeldung: "NameError: name 'variable' is not defined"

Was würdet ihr vorschlagen, um dies am einfachsten zu lösen?

(falls sowas ähnliches schonmal besprochen wurde, sorry für die Wiederholung, aber ich habe nichts passendes gefunden)

Vielen lieben Dank schon im Voraus.
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt Dir die erzeugten Knöpfe in einer Datenstruktur speichern:

Code: Alles auswählen

import tkinter

texts = ["variable", "operator", "tupel"]

main = tkinter.Tk()
buttons = {}
for text in texts:
    button = tkinter.Button(main, width=8, height=1, text=text, bg="#2b2b2b", fg="#a9b7c6")
    button.pack()
    buttons[text] = button

main.mainloop()
fencestake
User
Beiträge: 4
Registriert: Sonntag 13. Dezember 2020, 17:13

Hi Sirius3

Vielen Dank für die rasche Antwort. Die "texts" werden so in einem dictionary gespeichert:
{'variable': <tkinter.Button object .!button>, 'operator': <tkinter.Button object .!button2>, 'tupel': <tkinter.Button object .!button3>}

Wie kann ich darauf zugreifen, wenn ich z. B. bei einem der drei Buttons die Höhe oder Breite ändern möchte?

Es sollen mit einem einfachen Code über 15 verschiedene Buttons (können später auch einige mehr werden) erzeugt werden. Es kann aber durchaus vorkommen, dass evtl. mal eben die Breite oder Höhe angepasst werden muss.

Beste Grüsse
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Wörterbücher gerhören zu den Grunddatentypen, die in jedem Anfängertutorial behandelt werden.
fencestake
User
Beiträge: 4
Registriert: Sonntag 13. Dezember 2020, 17:13

Hi Sirius3

Danke für die Info. Ich bin hier um zu lernen und Fragen zu klären.
Sorry, wenn ich Dir hierbei nicht folgen kann. Meinst du "keys" und "values"? Als value erhalten ich ".!button". Ich verstehe nicht, wie ich nun auf Parameter wie "width" oder "text" von diesem "value" zugreifen bzw. dies ändern kann.
Bitte entschuldigen, falls es sich hierbei um völlige basics handelt, aber jeder hat wohl mal klein angefangen. In den Tutorials finde ich nur "einfache" dictionaries, wobei die keys und values normalerweise strings oder integer sind.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du verwechselst gerade die Darstellung eines Objektes wenn es einfach per print ausgibt, und das was es wirklich ist. Dein Button ist nicht .!button. Sonder ein Button-Objekt, auf dem du arbeiten kannst. Also kannst du

Code: Alles auswählen

button_to_change = button_mapping["variable"]
machen, und button_to_change dann einfach veraendern.
Benutzeravatar
Dennis89
User
Beiträge: 1576
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

gibt es eine Regel für das 'eventuelle' anpassen der Breite oder Höhe?
Für den Anfang wäre es doch sicherlich mal sinnvoller die Größe so zu wählen, dass die für alle Buttons passt.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
fencestake
User
Beiträge: 4
Registriert: Sonntag 13. Dezember 2020, 17:13

@deets: ich kann weder zu "button_to_change" noch zu "button_mapping" im Netz etwas finden.
@Dennis89: nein, es gibt keine Regel dafür. Ich schreib kurz einen Ausschnitt aus meinem "Projekt", sodass es hoffentlich verständlicher wirkt.

Code: Alles auswählen

# frame: usefull: button: pw generator
btnpwgen = tkinter.Button(frusefull, text="password\ngenerator", command=pwgen)
btnprop(btnpwgen)
btnpwgen["height"] = 2
btnpwgen.grid(row=1, column=0)

# frame: usefull: button: colors
btncolors = tkinter.Button(frusefull, text="colors", command=colors)
btnprop(btncolors)
btncolors.grid(row=2, column=0)

# frame: usefull: button: calculator
btncalc = tkinter.Button(frusefull, text="calculator", command=calc)
btnprop(btncalc)
btncalc.grid(row=3, column=0)
ich habe es momentan so gelöst, dass die Eigenschaften (wie Höhe, Breite, Hinter- und Vordergrundfarbe der Buttons) in einer Definition (btnprob) gespeichert sind. Neben diesen drei oben aufgeführten Buttons sind aktuell noch 18 weitere im gleichen Fenster, und es können durchaus noch mehr werden. Das einzige, was sich immer ändert sind "text" und "command". Der Rest bleibt normalerweise gleich.
Wie ihr sehen könnt, habe ich beim pw generator die Höhe auf 2 geändert. Dies bildet die Ausnahme.

Mein Vorstellung wäre, dass ich nicht alle Buttons wie oben aufgeführt auflisten muss, sondern dass dies mit einer Schleife erstellt werden kann. Das Projekt an und für sich ist eine Übung für mich, um mich mit Python vertraut zu machen. Es soll quasi ein Hilfsprogramm werden, in dem ich die Basis-Informationen zu verschiedenen Themen aufrufen kann (Klick auf Button zeigt Text in Label).
Bei meinem aktuelle Wissensstand scheint mir dies eine vernünftige Übung zu sein.

Vielen Dank für Eure Hilfe.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

fencestake hat geschrieben: Mittwoch 16. Dezember 2020, 06:42 @deets: ich kann weder zu "button_to_change" noch zu "button_mapping" im Netz etwas finden.
Das sind Namen von Variablen.
button_mapping ist ein dictionary. Der Wert mit dem Schlüssrl "variable" wird zusätzlich an den Namen "button_to_change" gebunden.

Das ist absolute Grundlage. Ich würde vorschlagen, das offizielle Python Tutorial in der Dokumentation durch zu arbeiten, um ein Verständnis für die Sprache zu bekommen.
MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

Hallo fencestake,
das ist bestimmt, was du willst...
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 6.0
# in conjunction with Tcl version 8.6
# Dec 26, 2020 12:31:19 AM CET platform: Windows NT

import sys

try:
import Tkinter as tk
except ImportError:
import tkinter as tk

try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True


def vp_start_gui():
'''Starting point when module is the main routine.'''
global val, w, root, screen_width, screen_height, f2
root = tk.Tk()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
print(screen_width)
top = Toplevel1 (root)
root.mainloop()

w = None
class Toplevel1:
def __init__(self, top=None):
'''This class configures and populates the toplevel window.
top is the toplevel containing window.'''
_bgcolor = '#d9d9d9' # X11 color: 'gray85'
_fgcolor = '#000000' # X11 color: 'black'
_compcolor = '#d9d9d9' # X11 color: 'gray85'
_ana1color = '#d9d9d9' # X11 color: 'gray85'
_ana2color = '#ececec' # Closest X11 color: 'gray92'
top_width = 800
top_height = 600
top_x = 279
top_y = 154

top.geometry('{}x{}+{}+{}'.format(top_width, top_height, top_x, top_y))
top.minsize(120, 1)
top.maxsize(1284, 941)
top.resizable(1, 1)
top.title("New Toplevel")
top.configure(background="lightblue")
print('toplevel width: ' + str(top.winfo_width()))
f1 = form_auf_Top(top)

class form_auf_Top:
def __init__(self, name_top):
self.Frame1 = tk.Frame(name_top)
self.Frame1.place(relx=0.05, rely=0.05, relheight=0.9, relwidth=0.9)
self.Frame1.configure(relief='groove')
self.Frame1.configure(borderwidth="2")
self.Frame1.configure(relief="groove")
self.Frame1.configure(background="red")

print('frame1 width: ' + str(self.Frame1.winfo_width()))

btn1 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text = 'TicTacToe')
btn2 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.25, _relwidth=0.15, _relheight=0.15, _text = 'Vier-Gewinnt')
btn3 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.45, _relwidth=0.15, _relheight=0.15, _text = 'Schiffe-versenken')
btn4 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.65, _relwidth=0.15, _relheight=0.15, _text = '...')

# f2 = form2_auf_form1(self.Frame1)
# form2_auf_form1.erstelle_button_feld(f2, 10,10)


class form2_auf_form1:
def __init__(self, name_der_form):
self.Frame2 = tk.Frame(name_der_form)
self.Frame2.place(relx=0.25, rely=0.05, relheight=0.7, relwidth=0.7)

self.Frame2.configure(relief='groove')
self.Frame2.configure(borderwidth="2")
self.Frame2.configure(relief="groove")
self.Frame2.configure(background="green")
self.erstelle_button_feld(10, 10)

def erstelle_button_feld(self, _spalten, _reihen):
spalten = _spalten
reihen = _reihen
board=[[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]]
for i in range(spalten):
for j in range(reihen):
board[j]=button_auf_form2(self.Frame2, i*1/spalten, j*1/reihen, 1/spalten, 1/reihen, i, j)

class button_auf_form1:
def __init__(self, name_der_form, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text=''):
global form
form = name_der_form
self.farb_index = 0
self.text=_text
self.Button1 = tk.Button(name_der_form)
self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
self.Button1.configure(activebackground="#ececec")
self.Button1.configure(activeforeground="#000000")
self.Button1.configure(background="yellow")
self.Button1.configure(disabledforeground="#bfbfbf")
self.Button1.configure(foreground="#000000")
self.Button1.configure(highlightbackground="#d9d9d9")
self.Button1.configure(highlightcolor="black")
self.Button1.configure(pady="0")
self.Button1.configure(text=_text)
self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index, self.text))
self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

def button_handler1(self, farb_index, _text):
global form
print('bind_example_support.button_handler1')
print('Mouse button 1')
if _text == 'TicTacToe':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 3,3)
elif _text == 'Vier-Gewinnt':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 7,6)
elif _text == 'Schiffe-versenken':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 10,10)
sys.stdout.flush()

def button_handler2(self, p1,p2):
print('bind_example_support.button_handler2')
print('Mouse button %d' % p2)
sys.stdout.flush()

class button_auf_form2:
def __init__(self, name_der_form, _relx=0.1, _rely=0.1, _relwidth=0.2, _relheight=0.2, i=0, j=0):
self.farb_index = 0
self.Button1 = tk.Button(name_der_form)
self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
self.Button1.configure(activebackground="#ececec")
self.Button1.configure(activeforeground="#000000")
self.Button1.configure(background="yellow")
self.Button1.configure(disabledforeground="#bfbfbf")
self.Button1.configure(foreground="#000000")
self.Button1.configure(highlightbackground="#d9d9d9")
self.Button1.configure(highlightcolor="black")
self.Button1.configure(pady="0")
self.Button1.configure(text=str(i) + ':' + str(j))
self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index))
self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

def button_handler1(self, farb_index):
print('bind_example_support.button_handler1')
print('Mouse button 1')
self.farb_dir = {0 : "lightblue", 1 : "red", 2 : "green", 3 : "blue", 4:"yellow"}
self.Button1.configure(background=self.farb_dir[farb_index])
if self.farb_index == len(self.farb_dir)-1:
self.farb_index = -1
self.farb_index += 1
sys.stdout.flush()

def button_handler2(self, p1,p2):
print('bind_example_support.button_handler2')
print('Mouse button %d' % p2)
sys.stdout.flush()

if __name__ == '__main__':
vp_start_gui()
MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

Code: Alles auswählen

#! /usr/bin/env python
#  -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 6.0
#  in conjunction with Tcl version 8.6
#    Dec 26, 2020 12:31:19 AM CET  platform: Windows NT

import sys

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

try:
    import ttk
    py3 = False
except ImportError:
    import tkinter.ttk as ttk
    py3 = True


def vp_start_gui():
    '''Starting point when module is the main routine.'''
    global val, w, root, screen_width, screen_height, f2
    root = tk.Tk()
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    print(screen_width)
    top = Toplevel1 (root)
    root.mainloop()

w = None
class Toplevel1:
    def __init__(self, top=None):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9' # X11 color: 'gray85'
        _ana1color = '#d9d9d9' # X11 color: 'gray85'
        _ana2color = '#ececec' # Closest X11 color: 'gray92'
        top_width = 800
        top_height = 600
        top_x = 279
        top_y = 154

        top.geometry('{}x{}+{}+{}'.format(top_width, top_height, top_x, top_y))
        top.minsize(120, 1)
        top.maxsize(1284, 941)
        top.resizable(1,  1)
        top.title("New Toplevel")
        top.configure(background="lightblue")
        print('toplevel width: ' + str(top.winfo_width()))
        f1 = form_auf_Top(top)

class form_auf_Top:
    def __init__(self, name_top):
        self.Frame1 = tk.Frame(name_top)
        self.Frame1.place(relx=0.05, rely=0.05, relheight=0.9, relwidth=0.9)
        self.Frame1.configure(relief='groove')
        self.Frame1.configure(borderwidth="2")
        self.Frame1.configure(relief="groove")
        self.Frame1.configure(background="red")
        
        print('frame1 width: ' + str(self.Frame1.winfo_width()))
        
        btn1 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text = 'TicTacToe')
        btn2 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.25, _relwidth=0.15, _relheight=0.15, _text = 'Vier-Gewinnt')
        btn3 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.45, _relwidth=0.15, _relheight=0.15, _text = 'Schiffe-versenken')
        btn4 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.65, _relwidth=0.15, _relheight=0.15, _text = '...')

#         f2 = form2_auf_form1(self.Frame1)
#         form2_auf_form1.erstelle_button_feld(f2, 10,10)


class form2_auf_form1:
    def __init__(self, name_der_form):
        self.Frame2 = tk.Frame(name_der_form)
        self.Frame2.place(relx=0.25, rely=0.05, relheight=0.7, relwidth=0.7)

        self.Frame2.configure(relief='groove')
        self.Frame2.configure(borderwidth="2")
        self.Frame2.configure(relief="groove")
        self.Frame2.configure(background="green")
        self.erstelle_button_feld(10, 10)
        
    def erstelle_button_feld(self, _spalten, _reihen):    
        spalten = _spalten
        reihen = _reihen
        board=[[0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0],
               [0,0,0,0,0,0,0,0,0,0]]
        for i in range(spalten):
            for j in range(reihen):
                board[i][j]=button_auf_form2(self.Frame2, i*1/spalten, j*1/reihen, 1/spalten, 1/reihen, i, j)
                
class button_auf_form1:
    def __init__(self, name_der_form, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text=''):
        global form
        form = name_der_form
        self.farb_index = 0
        self.text=_text
        self.Button1 = tk.Button(name_der_form)
        self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
        self.Button1.configure(activebackground="#ececec")
        self.Button1.configure(activeforeground="#000000")
        self.Button1.configure(background="yellow")
        self.Button1.configure(disabledforeground="#bfbfbf")
        self.Button1.configure(foreground="#000000")
        self.Button1.configure(highlightbackground="#d9d9d9")
        self.Button1.configure(highlightcolor="black")
        self.Button1.configure(pady="0")
        self.Button1.configure(text=_text)
        self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index, self.text))
        self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
        self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

    def button_handler1(self, farb_index, _text):
        global form
        print('bind_example_support.button_handler1')
        print('Mouse button 1')
        if _text == 'TicTacToe':
            print('')
            f2 = form2_auf_form1(form)
            form2_auf_form1.erstelle_button_feld(f2, 3,3)
        elif _text == 'Vier-Gewinnt':
            print('')
            f2 = form2_auf_form1(form)
            form2_auf_form1.erstelle_button_feld(f2, 7,6)
        elif _text == 'Schiffe-versenken':
            print('')
            f2 = form2_auf_form1(form)
            form2_auf_form1.erstelle_button_feld(f2, 10,10)
        sys.stdout.flush()

    def button_handler2(self, p1,p2):
        print('bind_example_support.button_handler2')
        print('Mouse button %d' % p2)
        sys.stdout.flush()
                
class button_auf_form2:
    def __init__(self, name_der_form, _relx=0.1, _rely=0.1, _relwidth=0.2, _relheight=0.2, i=0, j=0):
        self.farb_index = 0
        self.Button1 = tk.Button(name_der_form)
        self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
        self.Button1.configure(activebackground="#ececec")
        self.Button1.configure(activeforeground="#000000")
        self.Button1.configure(background="yellow")
        self.Button1.configure(disabledforeground="#bfbfbf")
        self.Button1.configure(foreground="#000000")
        self.Button1.configure(highlightbackground="#d9d9d9")
        self.Button1.configure(highlightcolor="black")
        self.Button1.configure(pady="0")
        self.Button1.configure(text=str(i) + ':' + str(j))
        self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index))
        self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
        self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

    def button_handler1(self, farb_index):
        print('bind_example_support.button_handler1')
        print('Mouse button 1')
        self.farb_dir = {0 : "lightblue", 1 : "red", 2 : "green", 3 : "blue", 4:"yellow"}
        self.Button1.configure(background=self.farb_dir[farb_index])
        if self.farb_index == len(self.farb_dir)-1:
            self.farb_index = -1          
        self.farb_index += 1
        sys.stdout.flush()

    def button_handler2(self, p1,p2):
        print('bind_example_support.button_handler2')
        print('Mouse button %d' % p2)
        sys.stdout.flush()

if __name__ == '__main__':
    vp_start_gui()






MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

MissMapeL hat geschrieben: Montag 28. Dezember 2020, 22:58 Hallo fencestake,
das ist bestimmt, was du willst...
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 6.0
# in conjunction with Tcl version 8.6
# Dec 26, 2020 12:31:19 AM CET platform: Windows NT

import sys

try:
import Tkinter as tk
except ImportError:
import tkinter as tk

try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True


def vp_start_gui():
'''Starting point when module is the main routine.'''
global val, w, root, screen_width, screen_height, f2
root = tk.Tk()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
print(screen_width)
top = Toplevel1 (root)
root.mainloop()

w = None
class Toplevel1:
def __init__(self, top=None):
'''This class configures and populates the toplevel window.
top is the toplevel containing window.'''
_bgcolor = '#d9d9d9' # X11 color: 'gray85'
_fgcolor = '#000000' # X11 color: 'black'
_compcolor = '#d9d9d9' # X11 color: 'gray85'
_ana1color = '#d9d9d9' # X11 color: 'gray85'
_ana2color = '#ececec' # Closest X11 color: 'gray92'
top_width = 800
top_height = 600
top_x = 279
top_y = 154

top.geometry('{}x{}+{}+{}'.format(top_width, top_height, top_x, top_y))
top.minsize(120, 1)
top.maxsize(1284, 941)
top.resizable(1, 1)
top.title("New Toplevel")
top.configure(background="lightblue")
print('toplevel width: ' + str(top.winfo_width()))
f1 = form_auf_Top(top)

class form_auf_Top:
def __init__(self, name_top):
self.Frame1 = tk.Frame(name_top)
self.Frame1.place(relx=0.05, rely=0.05, relheight=0.9, relwidth=0.9)
self.Frame1.configure(relief='groove')
self.Frame1.configure(borderwidth="2")
self.Frame1.configure(relief="groove")
self.Frame1.configure(background="red")

print('frame1 width: ' + str(self.Frame1.winfo_width()))

btn1 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text = 'TicTacToe')
btn2 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.25, _relwidth=0.15, _relheight=0.15, _text = 'Vier-Gewinnt')
btn3 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.45, _relwidth=0.15, _relheight=0.15, _text = 'Schiffe-versenken')
btn4 = button_auf_form1(self.Frame1, _relx=0.05, _rely=0.65, _relwidth=0.15, _relheight=0.15, _text = '...')

# f2 = form2_auf_form1(self.Frame1)
# form2_auf_form1.erstelle_button_feld(f2, 10,10)


class form2_auf_form1:
def __init__(self, name_der_form):
self.Frame2 = tk.Frame(name_der_form)
self.Frame2.place(relx=0.25, rely=0.05, relheight=0.7, relwidth=0.7)

self.Frame2.configure(relief='groove')
self.Frame2.configure(borderwidth="2")
self.Frame2.configure(relief="groove")
self.Frame2.configure(background="green")
self.erstelle_button_feld(10, 10)

def erstelle_button_feld(self, _spalten, _reihen):
spalten = _spalten
reihen = _reihen
board=[[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]]
for i in range(spalten):
for j in range(reihen):
board[j]=button_auf_form2(self.Frame2, i*1/spalten, j*1/reihen, 1/spalten, 1/reihen, i, j)

class button_auf_form1:
def __init__(self, name_der_form, _relx=0.05, _rely=0.05, _relwidth=0.15, _relheight=0.15, _text=''):
global form
form = name_der_form
self.farb_index = 0
self.text=_text
self.Button1 = tk.Button(name_der_form)
self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
self.Button1.configure(activebackground="#ececec")
self.Button1.configure(activeforeground="#000000")
self.Button1.configure(background="yellow")
self.Button1.configure(disabledforeground="#bfbfbf")
self.Button1.configure(foreground="#000000")
self.Button1.configure(highlightbackground="#d9d9d9")
self.Button1.configure(highlightcolor="black")
self.Button1.configure(pady="0")
self.Button1.configure(text=_text)
self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index, self.text))
self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

def button_handler1(self, farb_index, _text):
global form
print('bind_example_support.button_handler1')
print('Mouse button 1')
if _text == 'TicTacToe':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 3,3)
elif _text == 'Vier-Gewinnt':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 7,6)
elif _text == 'Schiffe-versenken':
print('')
f2 = form2_auf_form1(form)
form2_auf_form1.erstelle_button_feld(f2, 10,10)
sys.stdout.flush()

def button_handler2(self, p1,p2):
print('bind_example_support.button_handler2')
print('Mouse button %d' % p2)
sys.stdout.flush()

class button_auf_form2:
def __init__(self, name_der_form, _relx=0.1, _rely=0.1, _relwidth=0.2, _relheight=0.2, i=0, j=0):
self.farb_index = 0
self.Button1 = tk.Button(name_der_form)
self.Button1.place(relx=_relx, rely=_rely, relwidth=_relwidth, relheight=_relheight)
self.Button1.configure(activebackground="#ececec")
self.Button1.configure(activeforeground="#000000")
self.Button1.configure(background="yellow")
self.Button1.configure(disabledforeground="#bfbfbf")
self.Button1.configure(foreground="#000000")
self.Button1.configure(highlightbackground="#d9d9d9")
self.Button1.configure(highlightcolor="black")
self.Button1.configure(pady="0")
self.Button1.configure(text=str(i) + ':' + str(j))
self.Button1.bind('<Button-1>',lambda e:self.button_handler1(self.farb_index))
self.Button1.bind('<Button-2>',lambda e:self.button_handler2(e,2))
self.Button1.bind('<Button-3>',lambda e:self.button_handler2(e,3))

def button_handler1(self, farb_index):
print('bind_example_support.button_handler1')
print('Mouse button 1')
self.farb_dir = {0 : "lightblue", 1 : "red", 2 : "green", 3 : "blue", 4:"yellow"}
self.Button1.configure(background=self.farb_dir[farb_index])
if self.farb_index == len(self.farb_dir)-1:
self.farb_index = -1
self.farb_index += 1
sys.stdout.flush()

def button_handler2(self, p1,p2):
print('bind_example_support.button_handler2')
print('Mouse button %d' % p2)
sys.stdout.flush()

if __name__ == '__main__':
vp_start_gui()
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MissMapeL: Das will bestimmt niemand. PAGE generiert extrem besch…eidenen Quelltext.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
MissMapeL
User
Beiträge: 22
Registriert: Mittwoch 30. Oktober 2019, 10:26

Lieber blackjack,
wenn Du nur negative Kritik üben kannst - lass es doch besser.
Dieses Forum ist doch dafür da, dass man etwas lernen kann. - Und aus deinem Satz: "Das will bestimmt niemand. PAGE generiert extrem besch…eidenen Quelltext." lernt niemand etwas.
- Sag doch lieber was an Page schlecht ist!
- Schau dir dann das von mir geschriebene Programm an (und nicht bloß den header) und kritisiere konkret.
- Ja, ich bin noch Anfänger in Python, deshalb habe ich gedacht, ich könnte mit meinem Programmcode weiterhelfen.
Wenn dem nicht so ist, braucht das ja niemand zu verwenden.

Letztendlich verstehe ich deine - und so lese ich es - aggressive Antwort nicht!

Trotzdem wünsche ich dir ein schönes, gesundes und friedliches 2021.
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MissMapeL: Es ist egal was an PAGE schlecht ist, denn das kannst Du ja sowieso nicht ändern, das hat/haben der/die Autor(en) von PAGE verbockt. Was man daraus lernen kann, und ja das hätte ich vielleicht explizit schreiben sollen: Verwende kein PAGE! Der Quelltext der da raus kommt ist nicht nur unpythonisch sondern auch ganz allgemein schlecht und wirr. Mehr als den Header brauche ich mir da konkret auch nicht anschauen, denn ich weiss ja, dass danach Müll kommt. Der ist auch nicht reparierbar ohne das man ihn gleich komplett neu schreiben würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten