gdever
Янв. 8, 2008 22:21:16
Есть такая задача - сделать окно с кнопкой посередине, причем между кнопкой и границей окна должен быть зазор, ну скажем пять пикселей. Вопрос - как это сделать? Я пробовал так -
#!/usr/python
import wx
class ColoredPanel( wx.Panel ):
def __init__( self , parent , Color ):
wx.Panel.__init__( self , parent , id = -1 );
self.SetBackgroundColour( Color );
class TextFrame(wx.Frame):
def __init__( self ):
wx.Frame.__init__( self , None , -1 , ‘Example’ )
sizer = wx.FlexGridSizer( rows = 3 , cols = 3 )
sizer.AddGrowableCol( 0 , 0 );
sizer.AddGrowableCol( 1 , 1 );
sizer.AddGrowableCol( 2 , 0 );
sizer.AddGrowableRow( 0 , 0 );
sizer.AddGrowableRow( 1 , 1 );
sizer.AddGrowableRow( 2 , 0 );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
sizer.Add( ColoredPanel( self , “green” ) , 1 , wx.EXPAND );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
sizer.Add( wx.Button( self , label = “Button1” ) , 1 , wx.EXPAND );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
sizer.Add( ColoredPanel( self , “green” ) , 1 , wx.EXPAND );
sizer.Add( ( 5 , 5 ) , 1 , wx.EXPAND );
self.SetSizer( sizer )
self.Fit();
if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = TextFrame()
frame.Show()
app.MainLoop()
но чет как-то по-левому получается… Кто-нибудь знает как решить проблему? Может у кого-нибудь есть туториалы толковые?
Jenyay
Янв. 9, 2008 15:16:31
Кнопка по середине по вертикали или горизонтали? И должна ли она растягиваться при изменении размеров окна?
Jenyay
Янв. 9, 2008 15:26:26
А то самое простое:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# generated by wxGlade 0.5 on Wed Jan 09 16:03:52 2008
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.button_1 = wx.Button(self, -1, “button_1”)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle(“frame_1”)
self.SetSize((228, 151))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
grid_sizer_1 = wx.FlexGridSizer(1, 1, 0, 0)
grid_sizer_1.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
self.SetSizer(grid_sizer_1)
grid_sizer_1.AddGrowableRow(0)
grid_sizer_1.AddGrowableCol(0)
self.Layout()
# end wxGlade
# end of class MyFrame
if __name__ == “__main__”:
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, “”)
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
gdever
Янв. 12, 2008 16:33:46
в том-то и дело что кнопка должна растягиваться при ресайзе окна по горизонтали и вертикали таким образом чтобы между кнопкой и рамкой окна всегда оставалось фиксированное количество пикселей
Jenyay
Янв. 12, 2008 22:19:33
А по горизонтали и по вертикали зазоры должны быть одинаковые или могут быть разными?
Jenyay
Янв. 12, 2008 22:32:33
Вот в самом общем случае можно играться с помощью AddSpacer.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.5 on Sat Jan 12 23:22:40 2008 from C:\temp\sizers\sizers2.wxg
import wx
class MyFrame1(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame1.__init__
kwds = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.button_1 = wx.Button(self, -1, “button_1”)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame1.__set_properties
self.SetTitle(“frame_2”)
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame1.__do_layout
grid_sizer_2 = wx.FlexGridSizer(3, 3)
grid_sizer_2.AddSpacer (10)
grid_sizer_2.AddSpacer (20)
grid_sizer_2.AddSpacer (5)
grid_sizer_2.AddSpacer (0)
grid_sizer_2.Add(self.button_1, 0, wx.EXPAND|wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM, 0)
grid_sizer_2.AddSpacer (0)
grid_sizer_2.AddSpacer (15)
self.SetSizer(grid_sizer_2)
grid_sizer_2.Fit(self)
grid_sizer_2.AddGrowableRow(1)
grid_sizer_2.AddGrowableCol(1)
self.Layout()
# end wxGlade
# end of class MyFrame1
if __name__ == “__main__”:
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
dialog_1 = MyFrame1(None, -1, “”)
app.SetTopWindow(dialog_1)
dialog_1.Show()
app.MainLoop()