2

フレームを正方形(チェス盤のように)に保ちたいと思っています。サイズ変更可能です。これが私が試したものです。フレームを正方形に保ちますが、サイズは小さくなりません。サイズが大きくなるだけです。

import wx

class MainWindow (wx.Frame):
    def __init__ (self):
        wx.Frame.__init__(self, None)
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Show()

    def OnSize (self, event):
        w,h = self.GetClientSize()
        size = max(w,h)
        self.SetClientSize((size,size))

if __name__ == '__main__':
    app = wx.PySimpleApp()
    win = MainWindow()
    app.MainLoop()
4

1 に答える 1

1

(RobinDunnによって提案された私のコメントからコピーされました)

問題は、max(w, h)常に最大数を返すことです。したがって、サイズを水平方向に小さくする場合、垂直方向のサイズは水平方向のサイズを無効にします。したがって、理想的には、で何が変更されたかを知りたいOnSizeので、ユーザーの意図が何であったか(増加または減少)を推測し、min/maxそれに応じて使用できます。1つのアイデアは、以前のサイズをフレームに保存して、新しいサイズと以前のサイズを比較できるようにすることです。

アイデアは以下のコードのようなものです。それはまだ端の周りが荒いことに注意してください、しかしそれはあなたに出発点を与えるはずです。

import wx


class MainWindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self._size = self.ClientSize
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Show()

    def OnSize(self, event):
        if self._size[0] != self.ClientSize[0]:
            self._size = self.ClientSize[0], self.ClientSize[0]
        elif self._size[1] != self.ClientSize[1]:
            self._size = self.ClientSize[1], self.ClientSize[1]

        if self._size != self.ClientSize:
            self.ClientSize = self._size


if __name__ == '__main__':
    app = wx.PySimpleApp()
    win = MainWindow()
    app.MainLoop()
于 2013-01-16T20:33:53.400 に答える