Seite 2 von 2

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Montag 18. Juli 2022, 19:48
von __deets__
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.

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 11:19
von Rene1303
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()

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 11:36
von __deets__
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.

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 11:38
von Dennis89
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

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 11:48
von Rene1303
@__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.

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 13:11
von Rene1303
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()

Re: Programm für Fenster / Desktopwechsel Windows

Verfasst: Dienstag 19. Juli 2022, 13:23
von __blackjack__
@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.