Mam problemy z programem, który pisałem i docenię pomoc lub dane wejściowe. Na pewnym tle używam Pythona 2.7 i wxPythona, aby zrobić klienta kamery strumieniowej. Klient pobiera obrazy z serwera we własnym wątku i umieszcza je w kolejce. Wątek GUI pobiera te obrazy z kolejki i konwertuje je do obiektu wxBitmap
. Dzieje się to co 0,5 sekundy i działa świetnie. Jestem w stanie zapisać obiekt wxBitmap
jako plik, więc wiem, że wszystko działa poprawnie.Problemy z wyświetlaniem wxBitmaps za pomocą wxPython
Problem, który mam, polega na tym, że obiekt wxBitmap
pojawia się na moim GUI. Jedyne, co wydaje mi się być w stanie zrobić GUI to wyświetlanie szarego prostokąta, w którym powinien być obraz kamery internetowej.
Oto mój onPaint()
która jest wywoływana, gdy chcę, aby odświeżyć ekran:
def onPaint(self,e):
## this is the function that actually draws and redraws the window
## to be displayed. I think it is something similar to blit()
## in other graphical display frameworks
print "in onPaint"
## create the device context object (graphics painter)
dc = wx.PaintDC(self)
dc.BeginDrawing()
## draw the bitmap to the screen
dc.DrawBitmap(self.imageBit,0,0,True)
dc.EndDrawing()
## test code.
## the following works and updates, which means that
## everything is being converted properly and updated.
## not sure why the dc won't paint it to the window.
self.imageBit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)
Mówiąc najprościej, jestem w rozterce, dlaczego jej nie działa. z moich badań wynika, że ponieważ jestem na komputerze z systemem Windows potrzebowałem funkcji BeginDrawing()
i EndDrawing()
, więc dodałem je. Nadal nie działa. Nie są zgłaszane żadne błędy ani wyjątki.
innych pytań, które mogą pomóc rozwiązać ten problem:
- mam aktualizowania
wxFrame
obiektu. MożewxPaintDC
musi działać w innym typie pojemnika do pracy? - ?
Właściwie może moja funkcja __init__
jest tym, co trzyma problem. Czy to ustawienie jest poprawne?
class viewWindow(wx.Frame):
imgSizer = (480,360)
def __init__(self, *args, **kw):
## this is called when an instance of this class is created
super(viewWindow,self).__init__(*args,**kw)
## here is where the actual stuff inside the frame is set up.
self.pnl = wx.Panel(self)
## create a button that opens up a Connection Window
#test = wx.Button(self.pnl, label='Connection Settings')
## test.Bind(wx.EVT_BUTTON, self.openConnectionWindow)
## create the wxImage for the web cam pic
self.image = wx.EmptyImage(self.imgSizer[0],self.imgSizer[1])
## create the wxBitmap so that the wxImage can be displayed
self.imageBit = wx.BitmapFromImage(self.image)
## create a timer that will update the window based of frame rate
self.timex = wx.Timer(self, wx.ID_OK)
self.timex.Start(500)
self.Bind(wx.EVT_TIMER, self.redraw, self.timex)
## need to do the following in order to display images in wxPython:
self.Bind(wx.EVT_PAINT, self.onPaint)
self.SetSize(self.imgSizer)
self.SetTitle('View Window')
self.Show()
W każdym razie, z góry dzięki za pomoc.
EDYCJA: Rozwiązałem problem przez przypadek, kasując linię self.pnl = wx.Panel(self)
.
Najwyraźniej renderowanie było prawidłowe, ale bitmapa znajdowała się pod panelem. Może? Nie jestem do końca pewny. Jestem nowy w tej całej sprawie wxPython.
Obraz znajdujący się pod panelem jest możliwy. Dopóki nie ustawisz wyraźnie pozycji użycia 'wx.Sizer', obiekt domyślnie (0,0). Dlatego używam sizera, nawet jeśli mam tylko 1 przedmiot. – acattle