2010-09-18 7 views
1

В значительной степени именно так, как кажется. У меня есть кнопки в Wx.Frame, которые создаются «на лету», и мне хотелось бы, чтобы родительский кадр увеличивался по высоте, добавляя новые кнопки. Высота уже приобретается из общего количества кнопок, умноженных на целое число, равное высоте каждой кнопки, но я не знаю, как заставить кадр изменять размер на основе этого при добавлении новых кнопок.WxPython - изменение размера WxFrame при добавлении нового контента?

В качестве побочного вопроса текущий метод, который у меня есть для обновления кнопок, создает неприятное мерцание, и мне было интересно, есть ли у кого-нибудь идеи по его устранению.

import wx 
import mmap 
import re 

class pt: 
    with open('note.txt', "r+") as note: 
     buf = mmap.mmap(note.fileno(), 0) 
     TL = 0 
     readline = buf.readline 
     while readline(): 
      TL += 1 
     readlist = note.readlines() 
    note.closed 

class MainWindow(wx.Frame): 

    def __init__(self, parent, title): 
     w, h = wx.GetDisplaySize() 
     self.x = w * 0 
     self.y = h - bdepth 

     self.container = wx.Frame.__init__(self, parent, title = title, pos = (self.x, self.y), size = (224, bdepth), style = wx.STAY_ON_TOP) 


     self.__DoButtons() 

     self.Show(True) 

    def __DoButtons(self): 

     for i, line in enumerate(pt.readlist): 

      strip = line.rstrip('\n') 
      todo = strip.lstrip('!') 

      self.check = re.match('!', strip) 
      self.priority = re.search('(\!$)', strip) 

      if self.check is None and self.priority is None: 
       bullet = wx.Image('bullet.bmp', wx.BITMAP_TYPE_BMP) 

       solid = wx.EmptyBitmap(200,64,-1) 
       dc = wx.MemoryDC() 
       dc.SelectObject(solid) 
       solidpen = wx.Pen(wx.Colour(75,75,75),wx.SOLID) 
       dc.SetPen(solidpen) 
       dc.DrawRectangle(0, 0, 200, 64) 
       dc.SetTextForeground(wx.Colour(255, 255, 255)) 
       dc.DrawBitmap(wx.BitmapFromImage(bullet, 32), 10, 28) 
       dc.DrawText(todo, 30, 24) 
       dc.SelectObject(wx.NullBitmap) 

       hover = wx.EmptyBitmap(200,64,-1) 
       dc = wx.MemoryDC() 
       dc.SelectObject(hover) 
       hoverpen = wx.Pen(wx.Colour(100,100,100),wx.SOLID) 
       dc.SetPen(hoverpen) 
       dc.DrawRectangle(0, 0, 200, 64) 
       dc.SetTextForeground(wx.Colour(255, 255, 255)) 
       dc.DrawBitmap(wx.BitmapFromImage(bullet, 32), 10, 28) 
       dc.DrawText(todo, 30, 24) 
       dc.SelectObject(wx.NullBitmap) 

       bmp = solid 

      elif self.priority is None: 
       checkmark = wx.Image('check.bmp', wx.BITMAP_TYPE_BMP) 

       checked = wx.EmptyBitmap(200,64,-1) 
       dc = wx.MemoryDC() 
       dc.SelectObject(checked) 
       checkedpen = wx.Pen(wx.Colour(50,50,50),wx.SOLID) 
       dc.SetPen(checkedpen) 
       dc.DrawRectangle(0, 0, 200, 50) 
       dc.SetTextForeground(wx.Colour(200, 255, 0)) 
       dc.DrawBitmap(wx.BitmapFromImage(checkmark, 32), 6, 24) 
       dc.DrawText(todo, 30, 24) 
       dc.SelectObject(wx.NullBitmap) 

       bmp = checked 

      else: 
       exclaim = wx.Image('exclaim.bmp', wx.BITMAP_TYPE_BMP) 

       important = wx.EmptyBitmap(200,64,-1) 
       dc = wx.MemoryDC() 
       dc.SelectObject(important) 
       importantpen = wx.Pen(wx.Colour(75,75,75),wx.SOLID) 
       dc.SetPen(importantpen) 
       dc.DrawRectangle(0, 0, 200, 50) 
       dc.SetTextForeground(wx.Colour(255, 180, 0)) 
       dc.DrawBitmap(wx.BitmapFromImage(exclaim, 32), 6, 24) 
       dc.DrawText(todo, 30, 24) 
       dc.SelectObject(wx.NullBitmap) 

       importanthover = wx.EmptyBitmap(200,64,-1) 
       dc = wx.MemoryDC() 
       dc.SelectObject(importanthover) 
       importanthoverpen = wx.Pen(wx.Colour(100,100,100),wx.SOLID) 
       dc.SetPen(importanthoverpen) 
       dc.DrawRectangle(0, 0, 200, 50) 
       dc.SetTextForeground(wx.Colour(255, 180, 0)) 
       dc.DrawBitmap(wx.BitmapFromImage(exclaim, 32), 6, 24) 
       dc.DrawText(todo, 30, 24) 
       dc.SelectObject(wx.NullBitmap) 

       bmp = important 

      b = wx.BitmapButton(self, i + 800, bmp, (10, i * 64), (bmp.GetWidth(), bmp.GetHeight()), style = wx.NO_BORDER) 


      if self.check is None and self.priority is None: 
       b.SetBitmapHover(hover) 
      elif self.priority is None: 
       b.SetBitmapHover(checked) 
      else: 
       b.SetBitmapHover(importanthover) 

     self.input = wx.TextCtrl(self, -1, "", (16, pt.TL * 64 + 4), (184, 24)) 
     self.Bind(wx.EVT_TEXT_ENTER, self.OnEnter, self.input) 

    def OnClick(self, event): 
     button = event.GetEventObject() 
     button.None 
     print('cheese') 

    def OnEnter(self, event): 
     value = self.input.GetValue() 
     pt.readlist.append('\n' + value) 

     self.__DoButtons() 

     with open('note.txt', "r+") as note: 
      for item in pt.readlist: 
       note.write("%s" % item) 
     note.closed 

bdepth = pt.TL * 64 + 32 
app = wx.App(False) 
frame = MainWindow(None, "Sample editor") 
app.SetTopWindow(frame) 
app.MainLoop() 

ответ

1

AFAIK нет способа автоматически изменить размер кадра, но вы можете вручную сбросить размер вашего кадра с SetSize()

например

w, h = self.GetClientSize() 
self.SetSize((w, h + height_of_your_new_button)) 

К получить желаемый результат, хотя с минимальными хлопоты вам нужно использовать классификатор, я не думаю, что когда-нибудь Theres хорошего повода, чтобы использовать абсолютное позиционирование. Я бы также рекомендовал использовать панель, которая обеспечивает перемещение между виджетами и согласованность компоновки кросс-платформы.


Zetcode Sizer Tutorial

wxPython Sizer Tutorial

+0

Я просто заметил это ---> 'b = wx.BitmapButton (self, i + 800, ..'. Ваш запрос на неприятности, если вы не позволяете wxPython выбирать 'id's' с помощью' -1', 'wx. ID_ANY' или 'wx.NEW_ID()' в противном случае вы могли бы вызвать конфликты. – volting

+0

Спасибо. Особенно интересна страница Zetcode. Я изменил идентификаторы, чтобы выбрать wxPython. – Tryst

+0

@Tryst: Ваш прием! – volting

1

Не дважды префиксов ваши методы, если вы не знаете, что вы делаете. Это напрямую не связано с вашим вопросом, но это приведет к ошибкам, которые вы не поймете позже.

См. Это stackoverflow вопрос и the python documentation что и почему.

+0

Спасибо, на самом деле, ничего, и все прямо сейчас полезно. Я очень новичок в этом (очевидно). – Tryst

Смежные вопросы