Monitorwechsel

Fragen zu Tkinter.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

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...
Python ist Cool!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und wo ist dieser Punkt?
Benutzeravatar
__blackjack__
User
Beiträge: 14090
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Das klingt alles nicht so toll :(
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso? Was an QScreen passt Dir nicht?
Benutzeravatar
__blackjack__
User
Beiträge: 14090
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Psst, wir sind im Tkinter-Unterforum. 😉
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ups. Ich lese ja immer nur “neueste Nachrichten”. Dann muss man halt ran an den API-Speck.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

habs mit win32.api und gui fertig gebastelt :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann - zeig was du gemacht hast 👍
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14090
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei Wörterbücher die immer den gleichen festen Satz an Schlüsseln haben auch eher eine Objekte einer Klasse sein sollten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten