Seite 1 von 1

Monitorwechsel

Verfasst: Dienstag 3. September 2019, 10:23
von DMD-OS
Hallo zusammen,
ich arbeite mit zwei angeschlossenen Monitoren und möchte, das Programm per Button zwischen diesen beiden hin- und herschalten.
Im Netz habe ich leider nichts passendes finden können, daher stelle ich hier mal die Frage, ob das möglich ist?
LG Chrissimaus

Re: Monitorwechsel

Verfasst: Dienstag 3. September 2019, 10:39
von __deets__
Bestimmt, aber nicht mit Python im Sinne von das ist schon eingebaut. Sondern mit APIs entweder des Betriebssystems, oder mit Qt und dessen Abstraktion darueber: https://doc.qt.io/qt-5/qscreen.html

Re: Monitorwechsel

Verfasst: Dienstag 3. September 2019, 17:19
von Der_Scripter
Ich habe nur ein Monitor kann deshalb nicht testen. Aber hab eine Idee.
Probier mal denn Erscheinungspunkt des Fenster so zu verändern dass es auf dem anderen Monitor angezeigt wird.
Klappt wahrscheinlich nicht aber probieren kann man es ja...

Re: Monitorwechsel

Verfasst: Dienstag 3. September 2019, 17:25
von __deets__
Und wo ist dieser Punkt?

Re: Monitorwechsel

Verfasst: Dienstag 3. September 2019, 18:29
von __blackjack__
@Der_Scripter: Wenn Du nur einen Monitor hast und das nicht testen kannst, dann solltest Du das auch nicht ins Programm einbauen. Zudem gibt es diverse Varianten wie mehr als ein Monitor ins System integriert werden kann. Das können tatsächlich separate Anzeigen sein die jeweils eigene Koordinaten haben, es kann aber auch eine ”virtuelle” Anzeige sein von der jeweils ein Teil auf jedem der Monitore angezeigt wird.

Re: Monitorwechsel

Verfasst: Mittwoch 4. September 2019, 07:13
von DMD-OS
Das klingt alles nicht so toll :(

Re: Monitorwechsel

Verfasst: Mittwoch 4. September 2019, 07:18
von __deets__
Wieso? Was an QScreen passt Dir nicht?

Re: Monitorwechsel

Verfasst: Mittwoch 4. September 2019, 07:54
von __blackjack__
@__deets__: Psst, wir sind im Tkinter-Unterforum. 😉

Re: Monitorwechsel

Verfasst: Mittwoch 4. September 2019, 08:19
von __deets__
Ups. Ich lese ja immer nur “neueste Nachrichten”. Dann muss man halt ran an den API-Speck.

Re: Monitorwechsel

Verfasst: Donnerstag 5. September 2019, 13:54
von DMD-OS
habs mit win32.api und gui fertig gebastelt :)

Re: Monitorwechsel

Verfasst: Donnerstag 5. September 2019, 13:57
von __deets__
Na dann - zeig was du gemacht hast 👍

Re: Monitorwechsel

Verfasst: Samstag 7. September 2019, 13:27
von DMD-OS

Code: Alles auswählen

    # BUTTON: SCREEN SWITCH - HEADER
    img_dual = Image.open(resource_LAYOUT(os.path.join(self.path_images, 'dual_monitor.png'))).resize((45, 20))
    image_dual = ImageTk.PhotoImage(img_dual)
    lb_screen = tk.Label(self.header, image=image_dual, width=80, height=25, relief=tk.GROOVE)
    lb_screen.image = image_dual
    lb_screen.pack(padx=2, side=tk.RIGHT)
    lb_screen.bind("<Enter>", lambda event:
                   self.hover_ON(event, 0, lb_screen, self.header, 5, " Monitorwechsel ", "lightsteelblue")
                   )
    lb_screen.bind("<Leave>", self.hover_OFF)
    lb_screen.bind("<Button-1>", self.change_screen)

    def change_screen(self, _):
        # ---> BUTTON: SCREEN SWITCH
        multiple_monitors = Multiple_Monitors()
        monitor_dict = multiple_monitors.get_MONITORDICT()
        if self.counter.get() == len(monitor_dict.items())-1:
            self.counter.set(0)
        else:
            self.counter.set(self.counter.get()+1)

        monitor_active = multiple_monitors.get_MONITORACTIVE()

        for key, value in monitor_dict[self.counter.get()].items():
            if key == 'Work':
                win32gui.MoveWindow(monitor_active,
                                    value[0],
                                    value[1],
                                    win32api.GetSystemMetrics(0),
                                    win32api.GetSystemMetrics(1),
                                    True
                                    )
                                    
class Multiple_Monitors:

    def __init__(self):
        self.get_MONITORDICT()

    @staticmethod
    def get_MONITORDICT():
        monitor_dict = {}
        monitors = win32api.EnumDisplayMonitors()
        for monitor_idx, monitor in enumerate(monitors):
            monitor_screen = win32api.GetMonitorInfo(monitors[monitor_idx][0])['Monitor']
            monitor_work = win32api.GetMonitorInfo(monitors[monitor_idx][0])['Work']
            monitor_flag = win32api.GetMonitorInfo(monitors[monitor_idx][0])['Flags']
            monitor_name = win32api.GetMonitorInfo(monitors[monitor_idx][0])['Device']
            monitor_dict[monitor_idx] = {'Monitor': monitor_screen,
                                         'Work': monitor_work,
                                         'Flag': monitor_flag,
                                         'Device': monitor_name
                                         }
        return monitor_dict

    @staticmethod
    def get_MONITORACTIVE():
        hwnd = win32gui.GetForegroundWindow()
        return hwnd

Re: Monitorwechsel

Verfasst: Samstag 7. September 2019, 19:24
von Sirius3
Die Klasse Multiple_Monitors ist unsinnig, da sie nur aus zwei staticmethods besteht, die also besser als Funktionen geschrieben werden. Wenn in ein Wörterbuch nur Schlüssel mit aufsteigenden Zahlen stehen, dann wäre eine Liste besser geeignet. Datentypen sollten auch nicht in Variablennamen vorkommen, denn jetzt mußt Du an jeder Stelle, wo monitor_dict steht, den Namen umschreiben.
Warum machst Du eine for-Schleife mit enumerate über monitors, so dass Du den Index und das Element `monitor` hast, dann benutzt Du das aber nicht, sondern nur den Index um umständlich auf `monitors[monitor_idx]` zuzugreifen?
Vier mal GetMonitorInfo aufzurufen um jeweils nur einen Wert davon zu verwenden, ist auch ziemliche Verschwendung.

Bleibt also

Code: Alles auswählen

def get_monitor_info():
    monitors = win32api.EnumDisplayMonitors()
    return [
        win32api.GetMonitorInfo(monitor)
        for monitor in monitors]
Wenn man auf einen Schlüssel "Work" in einem Wörterbuch zugreifen will, geht das auch einfacher als mit einer Schleife über alle Einträge. Lies nochmal in einem Grundlagentutorial über Wörterbücher nach.

Re: Monitorwechsel

Verfasst: Samstag 7. September 2019, 21:07
von __blackjack__
Wobei Wörterbücher die immer den gleichen festen Satz an Schlüsseln haben auch eher eine Objekte einer Klasse sein sollten.