Buttons mit for-Schleife
Verfasst: Sonntag 13. Dezember 2020, 17:23
von fencestake
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.
Re: Buttons mit for-Schleife
Verfasst: Mittwoch 16. Dezember 2020, 06:42
von fencestake
@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.
Re: Buttons mit for-Schleife
Verfasst: Montag 28. Dezember 2020, 22:58
von MissMapeL
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()