如何在 wxPython 中跨多个监视器创建框架?

Posted

技术标签:

【中文标题】如何在 wxPython 中跨多个监视器创建框架?【英文标题】:How to create a frame in wxPython across multiple monitors? 【发布时间】:2019-08-28 22:33:08 【问题描述】:

我正在尝试在 wxPython 中创建一个跨多个屏幕的框架。我正在尝试的设置包括一台 1366x768 的显示器和另一台 1080x1920 的纵向模式显示器。

win32api 中的GetSystemMetrics(76) 和GetSystemMetrics(77) 得到0 和-1144 以获取虚拟屏幕区域的左上角。

GetSystemMetrics(78) 和 GetSystemMetrics(79) 为我提供了 2446x1920 的总虚拟屏幕分辨率。

当我用 pos = (GetSystemMetrics(76), GetSystemMetrics(77)) 和 size = (GetSystemMetrics(78), GetSystemMetrics(79)) 调用框架时,由于某种原因,它给了我一个大小为第一个的框架仅监控。

import wx
from win32api import GetSystemMetrics

class SelectableFrame(wx.Frame):

    c1 = None
    c2 = None

    def __init__(self, parent, id, title, pos, size):
        wx.Frame.__init__(self, parent, id, title, pos, size, style=wx.NO_BORDER) 
        self.Show(True)
        self.ToggleWindowStyle(wx.STAY_ON_TOP)
        self.SetFocus()
        self.Raise()
        print(pos)
        print(size)

        self.Bind(wx.EVT_MOTION, self.OnMouseMove)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.SetCursor(wx.Cursor(wx.CURSOR_CROSS))

        self.alphaValue = 100
        self.SetTransparent(self.alphaValue)
        self.Maximize(True)

    def OnMouseMove(self, event):
        global x2, y2
        if event.Dragging() and event.LeftIsDown():
            self.c2 = event.GetPosition()
            x2 = self.c2.x
            y2 = self.c2.y            
            self.Refresh()

    def OnMouseDown(self, event):
        global x1, y1
        self.c1 = event.GetPosition()
        x1 = self.c1.x
        y1 = self.c1.y
        self.Refresh()

    def OnMouseUp(self, event):
        print(self.c1)
        print(self.c2)
        self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))           
        self.Destroy()

    def OnPaint(self, event):
        if self.c1 is None or self.c2 is None: return

        bdc = wx.PaintDC(self)
        dc = wx.GCDC(bdc)
        dc.SetPen(wx.Pen('red', 1))
        dc.SetBrush(wx.Brush(wx.Colour(0, 0, 0), wx.TRANSPARENT))

        dc.DrawRectangle(self.c1.x, self.c1.y, self.c2.x - self.c1.x, self.c2.y - self.c1.y)

if __name__=="__main__":

    app=wx.App(redirect=False)
    selectionFrame2 = SelectableFrame(
            parent=None, 
            id=wx.ID_ANY, 
            title="", 
            pos=(GetSystemMetrics(76),GetSystemMetrics(77)), 
            size=(GetSystemMetrics(78), GetSystemMetrics(79))
            )
    selectionFrame2.Show(True)

    app.MainLoop()

如何在 wxPython 中生成这个跨多个监视器的帧并设置它以使其适用于任何监视器组合?

【问题讨论】:

尝试删除 self.Maximize() 调用,看看它是否有效... 【参考方案1】:
wx.Display.GetCount()
# then you can get the geometry for each display
d = wx.Display(0)
d.GetGeometry()

这应该为您提供显示器的实际尺寸和位置。

【讨论】:

谢谢!我使用您的建议为每个显示器创建了一个框架。 如果答案解决了您的问题,请将其标记为已接受(答案左侧投票按钮下方的灰色组合框)。这在 *** 上被认为是礼貌的。还有一些人关心标签统计。

以上是关于如何在 wxPython 中跨多个监视器创建框架?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中跨多个字段创建简单的交叉表

如何在 Java 中跨多个不同的 SQL 数据库创建 ORM?

在谷歌测试中跨多个文件分离测试用例

如何在代码点火器模型中跨多个函数实现数据库锁定?

如何在 C++ 中跨多个源文件共享变量?

在 JOGL 中跨多个 QWidget 共享 VBO