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.