2010-09-17 4 views
0

Je suis actuellement capable de faire ceci pour faire la plupart de ce que je veux. Il dessine des boutons basés sur des lignes d'un fichier texte et gère la façon dont les différents états des boutons apparaissent. Ce qui me tracasse en ce moment, c'est quand self.input écrit dans le fichier texte que je n'ai aucune idée de comment l'obtenir pour tout redessiner pour ajouter ou mettre à jour les boutons basés sur le nouveau texte. J'ai essayé Update, Refresh, Show (False) puis Show(True) et je suis perplexe.Utiliser DC pour dessiner wx.BitMapButtons à la volée?

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 
    Note.closed 

class MainWindow(wx.Frame): 

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

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

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

     self.__DoButtons()    

     self.Show(True) 

    def __DoButtons(self): 

     Note = open('note.txt', "r+") 

     for i, line in enumerate(Note): 

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

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

      checkmark = wx.Image('check.bmp', wx.BITMAP_TYPE_BMP) 
      bullet = wx.Image('bullet.bmp', wx.BITMAP_TYPE_BMP) 
      exclaim = wx.Image('exclaim.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) 

      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) 

      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) 

      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) 

      if self.check is None and self.priority is None: 
       bmp = solid 
      elif self.priority is None: 
       bmp = checked 
      else: 
       bmp = important  

      b = wx.BitmapButton(self, i + 800, bmp, (0, i * 64), (solid.GetWidth(), solid.GetHeight()), style = wx.NO_BORDER) 
      b.SetBitmapDisabled(checked) 

      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) 

     Note.closed 

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

    def OnEnter(self, event): 
     editnote = open('note.txt', 'r+') 
     editnote.write(self.input.GetValue()) 
     editnote.close() 
     self.Update() 

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

Répondre

1

Theres inutile d'appeler Update() Refresh() etc par eux-mêmes. Ils ne créent pas automatiquement vos boutons, vous devez le faire.

Pour commencer, je refactoriserais votre __DoButtons() en deux méthodes, une pour créer vos boutons, et une autre pour récupérer les données de votre fichier et les formater en une structure de données appropriée -a list (et la traiter en conséquence si nécessaire) que vous pouvez ensuite passer à votre nouvelle méthode __DoButtons (qui fait la création du bouton).

Dans votre onEnter() vous devez appeler votre méthode __DoButtons() et de transmettre les données appropriées, si vous avez besoin d'ajouter de nouveaux boutons pourquoi ne vous obtenez pas les données directement à partir du widget textEntry et vous épargner les tracas de la lecture à partir du fichier.

+0

Eh bien, c'est bon à savoir. J'ai vu d'autres personnes suggérer de l'utiliser d'une manière comme ça, mais j'ai probablement manqué quelque chose dans leur contexte puisque 'Binds 'm'avait semblé magique au début. Très bien, je vais commencer par cela en étendant 'class pt' pour créer réellement une' list'. Probablement sera beaucoup plus efficace et utile. Je vais lire à ce sujet et revenir à ce fil une fois que j'ai fait plus de progrès. Merci. – Tryst

+0

Ce joli travail, il a soulevé quelques nouveaux problèmes, mais seulement à cause des sites sur ma partie. Merci encore! – Tryst

Questions connexes