listen zugriff

Fragen zu Tkinter.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo

mitlerweile habe ich es fertig, es sieht so aus wie ich mir das vorgestellt habe und es funktioniert so wie ich es mir vorgestellt habe.
Ein paar kleinigkeiten gibt es auch die nicht so schön sind, das flakern beim löschen und neu erstellen der labels und buttons, finde ich nicht so schön, vielleicht hat da jemand ein rat für mich wie ich das besser lösen kann.

Ist es möglich das flackern beim löschen und neu schreiben der Labels weg zu bekommen, das es nicht flackert?
Kann man nur den inhalt der Labels aktualisieren ohne das alle Labels und Buttons neu erstellt werden?
Ist es vielleicht besser den update der Labels und buttons an die buttons zu übergeben, d.h. wenn ein button geklickt wird soll erst dann das update erfolgen?

Ist es möglich die ganzen buttons funktionen in eine große funktion zu packen?

hier noch mal code erweitert

Vielen Dank
Gruß
ganja

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import absolute_import, division, print_function
import Tkinter as tk
from contextlib import closing
from datetime import datetime as DateTime
import MySQLdb
import serial
## test
import time
##
#### test
ts = time.time()
sec = int(ts)
dat = time.strftime('%Y-%m-%d')
zeit = time.strftime('%H:%M:%S')
zeit1 = time.strftime('%H')

BACKGROUND_COLOR = '#AAC4D3'
FONT = 'Verdana 10 bold'
   
def get_status():
	with closing(
		MySQLdb.connect('xxxxxxx', 'xxxxx', 'xxxx', 'xxxxx')
	) as connection:
		with closing(connection.cursor()) as cursor:
			cursor.execute(
				'SELECT idx, user, status, korrektur, name'
				'  FROM users'
				' ORDER BY idx'
			)
	return list(cursor)

### noch nicht 
def read_rfid():
	ser = serial.Serial("/dev/ttyAMA0")
	ser.baudrate = 9600
	daten = ser.read(12)
	ser.close()    
	daten = daten.replace("\x02", "" )
	daten = daten.replace("\x03", "" )
	daten = daten.lstrip()
	return daten
	
###### funktioniert noch nicht
#def set_kommen():
#	rfidnr = (open("/home/kul/ze/test.txt").read())
#	#print(rfidnr,"111111")
#	with closing(
#		MySQLdb.connect('192.168.4.139', 'kul', 'ikul', 'c1kul')
#	) as connection:
#		with closing(connection.cursor()) as cursor:
#			cursor.execute(
#				'SELECT idx, status'
#				'FROM users' 
#				'WHERE RFID=%s' % (rfidnr)
#				#"WHERE RFID = '" + (rfidnr) + "' "  geht noch nicht!!!!
#			)
#	print(idx, status)

def set_kommen():
	rfidnr = open("/home/pi/ze/test.txt").read()
	db=MySQLdb.connect("xxxxxx","xxxxxxx","xxxx","xxxxxxx")
	cursor = db.cursor()
	stat = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
	cursor.execute(stat)
	row = cursor.fetchall()
	for row0 in cursor:
		idx_user = row0[0]
		status = row0[1]
		#print (idx_user, status)
	if status in ['g', '']:
		cursor.execute("UPDATE users SET status='k' WHERE idx = %s",(idx_user))
		cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'k'))
	elif status in ['p', 'm', 'd']:
		#print(idx_user,status,"222222222")
		cursor.execute("UPDATE users SET status='k' WHERE idx = %s",(idx_user))
		cursor.execute("SELECT status, Uhrzeit FROM Zeitstempel WHERE idx = %s AND Datum = %s AND Status = %s Order by Sekunden DESC",(idx_user,dat,status))
		row5 = cursor.fetchall()
		for row5 in cursor:
			z1 = row5[1]
			status_new = row5[0]
			if z1 != 0:
				cursor.execute("INSERT INTO Arbeitszeit (idx, Datum, z1, z2, status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,z1,zeit,status_new))
				cursor.execute("DELETE FROM Zeitstempel WHERE idx = %s AND status = %s AND Datum = %s",(idx_user,status_new,dat))
	cursor.close()
	db.close()

def set_pause():
	rfidnr = open("/home/pi/ze/test.txt").read()
	db=MySQLdb.connect("xxxxxxxx","xxxxxxxx","xxxxxx","xxxxx")
	cursor = db.cursor()
	status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
	cursor.execute(status)
	row = cursor.fetchall()
	for row0 in cursor:
		idx_user = row0[0]
		status = row0[1]
		print (idx_user, status)
	cursor.execute("""UPDATE users SET status = 'p' WHERE idx = %s""",(idx_user))
	cursor.execute("""INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)""",(idx_user,dat,zeit,sec,'p'))
	cursor.close()
	db.close()

def set_mittag():
	rfidnr = open("/home/pi/ze/test.txt").read()
	db=MySQLdb.connect("xxxxxxxx","xxxxxxx","xxxxxxx","xxxxxxx")
	cursor = db.cursor()
	status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
	cursor.execute(stat)
	row = cursor.fetchall()
	for row0 in cursor:
		idx_user = row0[0]
		status = row0[1]
		#print (idx_user, status)
	cursor.execute("UPDATE users SET status = 'm' WHERE idx = %s",(idx_user))
	cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'m'))
	cursor.close()
	db.close()

def set_dienstgang():
	rfidnr = open("/home/pi/ze/test.txt").read()
	db=MySQLdb.connect("xxxxxxx","xxxxx","xxx","xxxxx")
	cursor = db.cursor()
	status = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
	cursor.execute(stat)
	row = cursor.fetchall()
	for row0 in cursor:
		idx_user = row0[0]
		status = row0[1]
		#print (idx_user, status)
	cursor.execute("UPDATE users SET status = 'd' WHERE idx = %s", (idx_user))
	cursor.execute("INSERT INTO Zeitstempel (idx, Datum, Uhrzeit, Sekunden, Status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,zeit,sec,'d'))
	cursor.close()
	db.close()

def set_gehen():
	rfidnr = open("/home/pi/ze/test.txt").read()
	db=MySQLdb.connect("xxxxxxxx","xxxxx","xxxxxx","xxxxx")
	cursor = db.cursor()
	stat = "SELECT idx, status FROM users WHERE RFID = '" + (rfidnr) + "'"
	cursor.execute(stat)
	row = cursor.fetchall()
	for row0 in cursor:
		idx_user = row0[0]
		status = row0[1]
		#print (idx_user, status)
	cursor.execute("UPDATE users SET status = 'g' WHERE idx = %s",(idx_user))
	cursor.execute("SELECT Status, Uhrzeit FROM Zeitstempel WHERE idx = %s AND Datum = %s AND Status = %s ORDER BY Sekunden DESC",(idx_user,dat,status))
	row8 = cursor.fetchall()
	for row8 in cursor:
		status_new = row8[0]
		z1new = row8[1]
		if (row8 != 0):
			cursor.execute("INSERT INTO Arbeitszeit (idx, Datum, z1, z2, status) VALUES (%s, %s, %s, %s, %s)",(idx_user,dat,z1new,zeit,'A'))
			cursor.execute("DELETE FROM Zeitstempel WHERE status = %s AND Datum = %s AND idx = %s",(status_new,dat,idx_user))
	cursor.close()
	db.close()
	
class AppGUI(object):
	def __init__(self):
		self.root = tk.Tk()
		self.root.title('ZEITERFASSUNG')
		self.root['background'] = BACKGROUND_COLOR
		self.root.geometry("800x650")#+24+10
	
		# frame oben time dat
		frame = tk.Frame(
			self.root, background='#AAC4D3', relief=tk.SUNKEN, border=2
		)
		frame.pack(fill=tk.X, pady=1)
		options = {'relief': tk.GROOVE, 'background': 'white', 'font': FONT}
		self.date_label = tk.Label(frame, **options)
		self.date_label.pack(side=tk.RIGHT)
		self.clock_label = tk.Label(frame, **options)
		self.clock_label.pack(side=tk.RIGHT)
     
		# frame mitte label and buttons
		self.status_frame = tk.Frame(
			self.root, background='#AAC4D3', relief=tk.FLAT, border=2
		)
		self.status_frame.pack(fill=tk.X, pady=1)
		self.status_widgets = list()

		self.update_status()
		self.update_clock()
		self.root.mainloop()
     
	def update_clock(self):
		now = DateTime.now()
		 self.date_label['text'] = format(now, '%Y-%m-%d')
		self.clock_label['text'] = format(now, '%H:%M:%S')
		self.root.after(500, self.update_clock)
     
	def update_status(self):
		for widget in self.status_widgets:
			widget.destroy()
		self.status_widgets = list()
		   
		options = {
			'relief': tk.RAISED, 'background': BACKGROUND_COLOR, 'font': FONT, 'width': 15, 'height': 2
		}
		row_number = 0
		for _, _, state, correction, name, in get_status():
			if correction == 'k':
				correction = 'ZEITKORREKTUR'
				
			if state == 'g':
				state = 'abwesend'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text, **options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
					button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen', command=set_kommen)
					button.grid(row=row_number, column=5)
					self.status_widgets.append(button)
				row_number += 1
			elif state == 'p':
				state = 'pause'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="yellow", font = "Verdana 10 bold")#**options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
					button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen', command=set_kommen)
					button.grid(row=row_number, column=5)
					self.status_widgets.append(button)
				row_number += 1
			elif state == 'm':
				state = 'mittag'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text,  relief="raised", width=15, height=2, bg="yellow", font = "Verdana 10 bold")#**options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
					button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen',command=set_kommen)
					button.grid(row=row_number, column=5)
					self.status_widgets.append(button)
				row_number += 1
			elif state == 'd':
				state = 'dienstgang'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="blue", font = "Verdana 10 bold")#**options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
					button = tk.Button(self.status_frame, relief="raised", width=5, height=1, bg='green', font = "Verdana 10 bold",text='kommen',command=set_kommen)
					button.grid(row=row_number, column=5)
					self.status_widgets.append(button)
				row_number += 1
			elif state == 'k':
				state = 'anwesend'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="green", font = "Verdana 10 bold")#**options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
					button_pause = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='yellow', font = "Verdana 10 bold",text='pause',command=set_pause)
					button_pause.grid(row=row_number, column=6)
					button_mittag = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='yellow', font = "Verdana 10 bold",text='mittag',command=set_mittag)
					button_mittag.grid(row=row_number, column=7)
					button_dienstgang = tk.Button(self.status_frame, relief="raised", width=7, height=1, bg='blue', font = "Verdana 10 bold",text='dienstgang', command=set_dienstgang)
					button_dienstgang.grid(row=row_number, column=8)
					button_gehen = tk.Button(self.status_frame, relief="raised", width=4, height=1, bg='red', font = "Verdana 10 bold",text='gehen',command=set_gehen)
					button_gehen.grid(row=row_number, column=9)
					self.status_widgets.append(button_pause)
					self.status_widgets.append(button_mittag)
					self.status_widgets.append(button_dienstgang)
					self.status_widgets.append(button_gehen)
				row_number += 1
			elif state == '!':
				state = 'unbekannt'
				for column_number, text in enumerate([name, state, correction]):#, urlaub, resturlaub]):
					label = tk.Label(self.status_frame, text=text, relief="raised", width=15, height=2, bg="dark-red", font = "Verdana 10 bold")#**options)
					label.grid(row=row_number, column=column_number)
					self.status_widgets.append(label)
				row_number += 1
				
		self.root.after(2000, self.update_status)
	
def main():
	AppGUI()
         
if __name__ == '__main__':
	main()
BlackJack

@ganja: Man will keine grossen Funktionen sondern kleine, die man leicht überschauen kann. Man kann bei den ganzen Codewiederholungen aber sicher noch gemeinsame Teile aus den Funktionen herausziehen. Und man könnte statt der einzelnen Funktionen mal überlegen die Geschäftslogik objektorientiert zu modellieren. Zum Beispiel ein `User`-Typ der die relevanten Daten enthält und Methoden um den Status zu ändern und so weiter.

Die globalen Variablen am Anfang des Moduls gehören da nicht hin. So wie die verwendet werden funktioniert das auch gar nicht. Schau Dir mal die Zeitstempel an die in der Datenbank landen. Beziehungsweise landen würden wenn da mal irgendwo ein `commit()` gemacht würde.

Warum gibt es auf jedem Label diese Buttons obwohl die doch gar nicht zum Label gehören‽ Wer an-, ab-, oder umgemeldet wird entscheidet doch anscheinend der RFID-Tag, auch wenn der Besitzer von dem Tag auf einen Button von einem anderen Benutzer drückt. Das ist verwirrend.

Den Inhalt der Labels könntest Du aktualisieren wenn Du die irgendwie identifizieren könntest. Und das würde auch nur dann ohne Veränderung der GUI Funktionieren wenn kein Benutzer hinzukommt oder weggeht.

Die `update_status()`-Methode ist zu lang, da sind auch zu viele Wiederholungen drin.

Hatte ich schon mal SQLAlchemy für den Datenbankzugriff erwähnt? Mit dem ORM wird es auch einfacher beziehungsweise ziemlich einfach eine `User`-Klasse zu schreiben.
BlackJack

@ganja: Die `fetchall()`-Aufrufe mit den Schleifen wenn nur *ein* Datensatz erwartet wird sind komisch. Es gibt `fetchone()`. Was auch komisch ist, beziehungsweise sogar falsch ist erst `fetchall()` auf dem Cursor-Objekt aufrufen, dann nicht mit dem Ergebnis machen ausser es an einen Namen zu binden der sehr unpassend ist (`row` für etwas das *mehrere* Datensätze repräsentiert), und *danach* dann über den Cursor zu iterieren! Ich hätte ehrlich gesagt nicht erwartet dass das funktioniert, und das ist so auch nicht dokumentiert.

Die angehängten Ziffern an die `row`-Namen sind dann auch sehr unschön. Ebenso die Indexzugriffe auf die Datensätze mit den ”magischen” Zahlen. Binde die Elemente besser an sprechende Bezeichner, dann lässt sich das leichter lesen und verstehen.

Das aufteilen des einen Zeitstempel-Wertes auf drei Spalten würde man besser als *einen* Wert in der Datenbank speichern. Der gesamte Entwurf kommt mir komisch bis unnötig Komplex vor. Warum nicht nur Arbeitszeit und am Anfang wird die Endzeit halt auf NULL gesetzt und erst wenn die Eingetragen ist, haben wir einen kompletten Eintrag. Desweiteren darf es pro Benutzer nur einen Eintrag mit NULL bei der Endzeit geben. Dann könnte man den aktuellen Status auch in dem Arbeitszeit-Datensatz speichern und muss den nicht beim Benutzer speichern.

In `set_gehen()` ist ein Fehler: `row8` ist *immer* ungleich 0. Ich verstehe den Sinn dieser Bedingung sowieso nicht wirklich.

Die Tabellen mal mit SQLAlchemy's ORM modelliert (mit geratenen Spaltentypen und ungetestet):

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
from datetime import datetime as DateTime

from sqlalchemy import CHAR, Column, DATE, ForeignKey, INTEGER, TIME, VARCHAR
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import object_session, relationship


Base = declarative_base()


class User(Base):

    __tablename__ = 'users'

    id = Column('idx', INTEGER, primary_key=True)
    # user = Column(?)  Wird in einer Abfrage erwähnt aber nirgends verwendet.
    status = Column(CHAR(1), nullable=False, default='!')
    correction = Column('korrektur', CHAR(1), nullable=False)
    name = Column(VARCHAR(200), nullable=False)
    rfid = Column('RFID', VARCHAR(100), unique=True)

    # `timestamps` as backreference from `Timestamp`
    # `worktimes` as backreference from `Worktime`

    def _add_timestamp(self, now=None):
        self.timestamps.append(Timestamp.now(self, now))

    def _timestamp2worktime(self, worktime_status, new_status):
        session = object_session(self)
        # 
        # Frage warum kann es hier mehr als einen Eintrag geben?  Darf das
        # überhaupt sein?
        # 
        timestamps = (
            session.query(Timestamp)
                .filter_by(date=now.date(), status=self.status)
                .order_by(Timestamp.seconds)
                .desc()
                .all()
        )
        for timestamp in timestamps:
            if timestamp.time != 0:
                session.add(
                    Worktime(
                        user=self,
                        date=timestamp.date(),
                        start_time=timestamp.time,
                        end_time=now.time(),
                        status=worktime_status,
                    )
                )
                break
                # Ich hoffe ich habe die Logik an der Stelle äquivalent
                # umgesetzt.
        for timestamp in timestamps:
            session.delete(timestamp)
        self.status = new_status

    def start_work(self):
        now = DateTime.now()
        if self.status in ['g', ' ']:
            self.status = 'k'
            self._add_timestamp(now)
        elif self.status in ['p', 'm', 'd']:
            self._timestamp2worktime(self.status, 'k')

    def start_break(self):
        self.status = 'p'
        self._add_timestamp()

    def start_lunch_break(self):
        self.status = 'm'
        self._add_timestamp()

    def start_business_errand(self):
        self.status = 'd'
        self._add_timestamp()

    def stop_work(self):
        self._timestamp2worktime('A', 'g')

    @classmethod
    def get_all(cls, session):
        return session.query(cls).all()

    @classmethod
    def get_by_rfid(cls, session, rfid):
        return session.query(cls).filter_by(rfid=rfid).one()


class Timestamp(Base):

    __tablename__ = 'Zeitstempel'

    id = Column(INTEGER, primary_key=True)
    user_id = Column('idx', INTEGER, ForeignKey(User), nullable=False)
    date = Column('Datum', DATE, nullable=False)
    time = Column('Uhrzeit', TIME, nullable=False)
    seconds = Column('Sekunden', INTEGER, nullable=False)
    status = Column('Status', CHAR(1), nullable=False)

    user = relationship(User, backref='timestamps')

    @classmethod
    def now(cls, user, now=None):
        if now is None:
            now = DateTime.now()
        return cls(
            user=user,
            date=now.date(),
            time=now.time().replace(second=0),
            seconds=now.second,
            status=user.status,
        )


class Worktime(Base):

    __tablename__ = 'Arbeitszeit'

    id = Column(INTEGER, primary_key=True)
    user_id = Column('idx', ForeignKey(User))
    date = Column('Datum', DATE, nullable=False)
    start_time = Column('z1', TIME, nullable=False)
    end_time = Column('z2', TIME, nullable=False)
    status = Column(CHAR(1), nullable=False)

    user = relationship(User, backref='worktimes')
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Guten Morgen,
Vielen Dank BlackJack das du dir wieder die mühe gemacht hast.
Sorry das ich nicht sofort feedback gegeben habe, war verhindert.

deine erste bemerkung,
`fetchone()`,`fetchall()`, das kenne ich, aber aus irgend einem grund hat es nur so funktioniert im shell script.

zweite,
werde ich in zukunft versuchen

drittens,
Das kann ich dir nicht sagen die DB ist schon vorhanden, und wie gesagt shell script funktioniert, warum man das so in der DB gemacht hat das weiß ich nicht, vielleicht auch unwissen wie bei mir.

viertens,
SQLAlchemy's ORM, davon habe ich noch nie etwas gehört bis du es erwennt hast, musste das modul nachinstallieren, muß aber jetzt erstmal mich da einbisschen einlesen.

dein code muss ich jetzt auch mal zeile für zeile durchgehen, um zu verstehen was da passiert

rfid = Column('RFID', VARCHAR(100), unique=True) ist in der DB ein BIGINT

mit den Tabellen liegst nicht viel falsch.
Leider habe ich jetzt keine ahnung ob man die 2 files zu einem macht oder ob das 2 eigenständige files bleiben und dan nur importiert zu einander werden.

Noch einmal Vielen Dank das du dir die mühen gemacht hast, ich muß noch viel viel lernen, damit es besser wird.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,
ich brauche nochmal kurz hilfe, ich möchte gerne alle user die da sind grün anzeigen, aber ich habe keine ahnung wie, wenn ich nur ein Label hätte dann wäre das kein Problem, aber hier in diesem fall komme ich nicht drauf wo ich background verändern soll wie gesagt nur die user die <anwesend> sind.

Danke im Voraus

Code: Alles auswählen

# ...
        row_number = 0
		for _, user, state, correction, _, in get_status():
			if correction == 'k':
				correction = 'ZEITKORREKTUR'
			if state == 'k':
				state = 'anwesend'

			if state == 'p':
				state = 'pause'

			if state == 'm':
				state = 'mittag'

			if state == 'd':
				state = 'dienstgang'

			if state == 'g':
				state = ''
				
			for column_number, text in enumerate([user, state, correction]):
				label = tk.Label(self.status_frame, text=text, **options)
				label.grid(row=row_number, column=column_number)
				self.status_widgets.append(label)
			row_number += 1
Zuletzt geändert von Anonymous am Mittwoch 9. Dezember 2015, 15:07, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ganja: die if-nicht-Kaskade könntest Du besser durch ein Wörterbuch abbilden. Für row_number kannst du auch enumerate benutzen. Wo ist das Problem, dem Label ein background-Attribut zu geben?

Code: Alles auswählen

for row_number, (_, user, state, correction, _) in enumerate(get_status()):
    if correction == 'k':
        correction = 'ZEITKORREKTUR'
    state = {
        'k': 'anwesend',
        'p': 'pause',
        'm': 'mittag',
        'd': 'dienstgang',
        'g': '',
    }[state]
    options['background'] = 'red' if state == 'anwesend' else 'green'
    for column_number, text in enumerate([user, state, correction]):
        label = tk.Label(self.status_frame, text=text, **options)
        label.grid(row=row_number, column=column_number)
        self.status_widgets.append(label)
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

erst einmal Vielen Dank sirius, es ist kann Problem wenn man es kann!
Ich möchte nur den user green haben, mit deinem code bekomme ich den user, state und correction grün, nach dem ich die if bedienung umgedreht habe.
das ist nicht ganz was ich will, es soll nur der user grün sein, state und correction sollen die farbe von frame haben, da blicke ich es nicht durch wo ich für den user und nur den user die farbe setzte.

Gruß
ganja
Antworten