Programm für Fenster / Desktopwechsel Windows

Du hast eine Idee für ein Projekt?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Es darf - wie hier schon mehrfach erwähnt - keine Endlosschleife geben. Und auch kein sleep. Stattdessen der callback, der periodisch aufgerufen wird.

Und natürlich kann die Länge auch woanders herkommen.
Rene1303
User
Beiträge: 22
Registriert: Montag 21. Februar 2022, 12:50

Hi,
ich wollte mein Programm übersichtlicher gestalten und das ganze auch mit Klassen aufbauen. Nur seither funktioniert meine Übernahme von den "Eingaben" aus uebernehmen() nicht mehr.

Ich kann den Fehler nicht sehen oder bin einfach nur blind. Kann mir jemand hier sagen, woran es liegen kann?

Code: Alles auswählen

import tkinter as tk
import time
from functools import partial

class MainWindow():
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master, relief=tk.RIDGE, borderwidth=5)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self.master.title("Auto-SWITCH")
        self.master.geometry("600x600")

        self.label = tk.Label(self.frame, text="Programm für automatischen Fensterwechsel").grid(row=1, column=1, columnspan=3, pady=15, padx=25)
        self.label = tk.Label(self.frame, text="Eingabe Zeitintervall Fenster 1").grid(row=2, column=1)
        self.label = tk.Label(self.frame, text="Eingabe Zeitintervall Fenster 2").grid(row=3, column=1)
        self.label = tk.Label(self.frame, text="Sek.").grid(row=2, column=3)
        self.label = tk.Label(self.frame, text="Sek.").grid(row=3, column=3)


        
        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=2, column=2)
        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=3, column=2)


        self.uebernehmen_button = tk.Button(self.frame, text="Übernehmen").grid(row=4, column=1, columnspan=3, pady=10)

        self.label = tk.Label(self.frame, text="Zeiten übernommen:").grid(row=5, column=1, columnspan=2)


        self.label = tk.Label(self.frame, text="Zeitintervall Fenster 1:").grid(row=6, column=1)
        self.label = tk.Label(self.frame, text="Zeitinvervall Fenster 2:").grid(row=7, column=1)

        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=6, column=2)
        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=7, column=2)

        

class timeentry:
   
                  

    def __init__(self, eingaben, eingabe, ausgaben, ausgabe):

        self.eingaben = eingaben
        self.eingabe = eingabe
        eingaben = []

        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=2, column=2)
        eingaben.append(eingabe)

        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=3, column=2)
        seingaben.append(eingabe)

        
        self.ausgaben = ausgaben
        self.ausgabe = ausgabe
        ausgaben = []

        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=6, column=2)
        ausgaben.append(ausgabe)

        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=7, column=2)
        ausgaben.append(ausgabe)

        assert len(eingaben) == len(ausgaben)

        self.uebernehmen_button["command"] = partial(uebernehmen, eingaben, ausgaben)






        

def convert(zeit_text):
    minutes_text, seconds_text = zeit_text.split(":")
    return int(minutes_text) * 60 + int(seconds_text)





def uebernehmen(eingaben, ausgaben):
    for eingabe, ausgabe in zip(eingaben, ausgaben):
        zeit = eingabe.get()
        print(zeit)
        print(convert(zeit))
        eingabe.delete(0, tk.END)
        ausgabe["state"] = tk.NORMAL
        ausgabe.delete(0, tk.END)
        ausgabe.insert(0, zeit)
        ausgabe["state"] = tk.DISABLED



def main():
    root = tk.Tk()
    
   
    app = MainWindow(root)
    app = timeentry

    root.mainloop()


if __name__ == '__main__':
    main()
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist alles kraut und rueben. timeentry wird gar nicht erzeugt, dem fehlen alle Argumente dazu, du legst alles moegliche unter den gleichen Namen an (eingabe, eingabe, eingabe und noch mal eingabe), Buttons haben kein Command. Da ist viel zu viel im argen, als das man da nur mal kurz einen Hinweis geben kann, was da fehlt.
Benutzeravatar
Dennis89
User
Beiträge: 1155
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

bleib bei einer Klasse. Es wird auch keine Insanz deiner 'timeentry'-Klasse erstellt, du bindest lediglich den Namen 'timentry' an den Namen 'app'.
Hier gibt es einige Beispielcodes mit Klassen und tkinter, daran kannst du dich orientieren.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Rene1303
User
Beiträge: 22
Registriert: Montag 21. Februar 2022, 12:50

@__deets__

Kannst du mir dann Schritt für Schritt bei der Richtigstellung helfen?


Ich wollte einfach eine übersichtliche Trennung zwischen den Funktionen und den GUI Aufbau. Da das Programm im Wesentlichen 2 Hauptfunktionen haben sollte (welche hier noch nicht komplett abgebildet sind), hatte ich vor diese auch zu Bündeln in Klasse Hauptfunktion 1 und Klasse Hauptfunktion 2.

Hauptfunktion 1 wäre hier die Übernahme der eingebenen Zeiten in den Entry-Feldern, welche als "eingabe" bezeichnet sind. Beim Betätigen des Buttons "Übernehmen" (Funktion "uebernehmen()") wird dann die Eingabe in die Entry-Felder übergeben, welche als "ausgabe" bezeichnet sind. Zusätzlich wird noch eine Umrechnung in Sekunden vorgenommen durch "convert()"

Hauptfunktion2 wäre dann dein Ansatz mit dem Callback und after. Hier sollen dann 2 Funktionen hintereinander aufgerufen werden.
Funktion 1 mit pyautogui.hotkey + Tastenkombination
danach dann
Funktion 2 mit pyautogui.hotkey + Tastenkombination

Zwischen den beiden Funktionen ist dann der Ansatz mit dem Callback einzubauen. Das habe ich bisher noch nicht hinbekommen, aber ich arbeite daran das ganze zu verstehen.
Rene1303
User
Beiträge: 22
Registriert: Montag 21. Februar 2022, 12:50

Hallo,

ich habe die Klasse timeentry entfernt und alles in eine Klasse eingefügt.

Leider habe ich hier 2 Probleme:

1. kann ich die Partialfunktion beim Betätigen des Button "Übernehmen" ausführen, da es ein NONE-Typ ist (scheint in meiner Struktur wegen der Klasse oder weil ich innerhalb der Klasse bin nicht zu funktionieren) --> Gibt es hier eine Lösung oder funktioniert sowas gar nicht?

2. Wenn ich den Part mit den Entry-Einträge direkt in def main () eintrage, dann funktioniert alles wie gewohnt, jedoch sind hier dann die anderen Anpassungen der GUI nicht berücksichtigt. Damit ich verstehe, warum es das macht, habe ich alle störenden Labels und Felder auskommentiert und nur die Entry gelassen. --> Kann dies nicht zusammenfassen mit der def __init__ in der Klasse? Nur dann bin ich wieder beim Problem 1.

Code: Alles auswählen

import tkinter as tk
import time
from functools import partial, partialmethod
import functools

class MainWindow():
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master, relief=tk.RIDGE, borderwidth=5)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self.master.title("Auto-SWITCH")
        self.master.geometry("600x600")

        self.label = tk.Label(self.frame, text="Programm für automatischen Fensterwechsel").grid(row=1, column=1, columnspan=3, pady=15, padx=25)
        self.label = tk.Label(self.frame, text="Eingabe Zeitintervall Fenster 1").grid(row=2, column=1)
        self.label = tk.Label(self.frame, text="Eingabe Zeitintervall Fenster 2").grid(row=3, column=1)
        self.label = tk.Label(self.frame, text="Sek.").grid(row=2, column=3)
        self.label = tk.Label(self.frame, text="Sek.").grid(row=3, column=3)

        
        self.eingaben = []
        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=2, column=2)
        self.eingaben.append(self.eingabe)
##
##        
        self.eingabe = tk.Entry(self.frame, bd=2, width=22).grid(row=3, column=2)
        self.eingaben.append(self.eingabe)


        self.uebernehmen_button = tk.Button(self.frame, text="Übernehmen").grid(row=4, column=1, columnspan=3, pady=10)
        

        self.label = tk.Label(self.frame, text="Zeiten übernommen:").grid(row=5, column=1, columnspan=2)


        self.label = tk.Label(self.frame, text="Zeitintervall Fenster 1:").grid(row=6, column=1)
        self.label = tk.Label(self.frame, text="Zeitinvervall Fenster 2:").grid(row=7, column=1)

        
        self.ausgaben = []
        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=6, column=2)
        self.ausgaben.append(self.ausgabe)
##        
        self.ausgabe = tk.Entry(self.frame, state=tk.DISABLED, bd=2, width=10).grid(row=7, column=2)
        self.ausgaben.append(self.ausgabe)
##
        assert len(self.eingaben) == len(self.ausgaben)

        print(self.eingabe)

##        self.uebernehmen_button["command"] = partial(self.uebernehmen, self.eingaben, self.ausgaben)


        

    def uebernehmen(self,eingaben, ausgaben):
        for self.eingabe, self.ausgabe in zip(eingaben, ausgaben):
            zeit = eingabe.get()
            print(zeit)
            print(convert(zeit))
            eingabe.delete(0, tk.END)
            ausgabe["state"] = tk.NORMAL
            ausgabe.delete(0, tk.END)
            ausgabe.insert(0, zeit)
            ausgabe["state"] = tk.DISABLED

        

        


   
                  

   






        

def convert(zeit_text):
    minutes_text, seconds_text = zeit_text.split(":")
    return int(minutes_text) * 60 + int(seconds_text)





def uebernehmen(eingaben, ausgaben):
    for eingabe, ausgabe in zip(eingaben, ausgaben):
        zeit = eingabe.get()
        print(zeit)
        print(convert(zeit))
        eingabe.delete(0, tk.END)
        ausgabe["state"] = tk.NORMAL
        ausgabe.delete(0, tk.END)
        ausgabe.insert(0, zeit)
        ausgabe["state"] = tk.DISABLED



def main():
    root = tk.Tk()
    app = MainWindow(root)

    frame = tk.Frame(root, relief=tk.RIDGE, borderwidth=5)
    frame.pack(fill=tk.BOTH, expand=True)
    eingaben = []

##    tk.Label(rahmen, text="Eingabe Zeitinterval Fenster 1").grid(
##        row=2, column=1
##    )
    eingabe = tk.Entry(frame, bd=2, width=22)
    eingabe.grid(row=2, column=2)
    eingaben.append(eingabe)
##    tk.Label(rahmen, text="Sek.").grid(row=2, column=3)

##    tk.Label(rahmen, text="Eingabe Zeitinterval Fenster 2").grid(
##        row=3, column=1
##    )
    eingabe = tk.Entry(frame, bd=2, width=22)
    eingabe.grid(row=3, column=2)
    eingaben.append(eingabe)
##    tk.Label(rahmen, text="Sek.").grid(row=3, column=3)

    uebernehmen_button = tk.Button(frame, text="Übernehmen")
    uebernehmen_button.grid(row=4, column=1, columnspan=3, pady=10)

##    tk.Label(rahmen, text="Zeiten übernommen:").grid(
##        row=5, column=1, columnspan=2
##    )

    ausgaben = []

##    tk.Label(rahmen, text="Zeitintervall Fenster 1:").grid(row=6, column=1)
    ausgabe = tk.Entry(frame, state=tk.DISABLED, bd=2, width=10)
    ausgabe.grid(row=6, column=2)
    ausgaben.append(ausgabe)

##    tk.Label(rahmen, text="Zeitintervall Fenster 2:").grid(row=7, column=1)
    ausgabe = tk.Entry(frame, state=tk.DISABLED, bd=2, width=10)
    ausgabe.grid(row=7, column=2)
    ausgaben.append(ausgabe)

    assert len(eingaben) == len(ausgaben)

    print(eingabe)
    uebernehmen_button["command"] = partial(uebernehmen, eingaben, ausgaben)
    

    root.mainloop()


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

@Rene1303: Das Ergebnis/der Rückgabewert der `grid()`-Methode ist `None`. Es macht keinen Sinn damit irgend etwas zu machen. Wenn Du etwas mit dem Widget selbst machen willst, musst Du *das* an einen Namen binden und nicht den Rückgabewert von `grid()`.

Und Du musst auch nicht alles an einen Namen binden, und noch weniger muss/sollte man *alles* an `self` binden. Da gehört nur das hin was auch tatsächlich den Zustand des Objekts ausmacht und in einer anderen Methode benutzt wird.

Und man bindet an `self` nichts neues ausserhalb der `__init__()`. Erst recht keine Laufvariablen einer Schleife in einer anderen Methode.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten