Tôi đã gặp một số vấn đề với một chương trình mà tôi đã viết và sẽ đánh giá cao một số trợ giúp hoặc đầu vào. Đối với một số nền, tôi đang sử dụng Python 2,7 và wxPython để làm một khách hàng webcam streaming. Máy khách nhận các hình ảnh từ máy chủ theo chủ đề riêng của nó và đặt chúng vào một Hàng đợi. Chủ đề GUI sau đó lấy những hình ảnh đó từ Hàng đợi và chuyển đổi chúng thành một đối tượng wxBitmap
. Điều này xảy ra sau mỗi giây và hoạt động rất tốt. Tôi có thể lưu đối tượng wxBitmap
dưới dạng tệp để tôi biết rằng mọi thứ đều hoạt động bình thường.vấn đề hiển thị wxBitmaps bằng cách sử dụng wxPython
Sự cố mà tôi đang gặp là thực sự nhận được đối tượng wxBitmap
để hiển thị trên GUI của tôi. Điều duy nhất tôi dường như có thể làm cho GUI làm là hiển thị một hình chữ nhật màu xám, nơi hình ảnh web cam nên được.
Đây là onPaint()
tôi được gọi là khi tôi muốn làm mới màn hình:
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ột cách đơn giản, tôi đang ở một mất mát như lý do tại sao nó không làm việc. từ nghiên cứu của tôi, tôi đã tìm thấy rằng bởi vì tôi đang ở trên một máy cửa sổ, tôi cần các hàm BeginDrawing()
và EndDrawing()
, vì vậy tôi đã thêm chúng. Vẫn không hoạt động. Không có lỗi hoặc ngoại lệ bị ném.
câu hỏi khác có thể giúp giải quyết vấn đề này:
- tôi cập nhật một đối tượng
wxFrame
. Có lẽ cácwxPaintDC
cần phải hoạt động trong một loại container để làm việc? - ?
Thực ra, có thể chức năng __init__
của tôi là gì đang xảy ra sự cố. Tôi có thiết lập đúng cách này không?
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()
Dù sao, cảm ơn trước sự giúp đỡ của bạn.
EDIT: Tôi đã giải quyết vấn đề vô tình bằng cách xóa dòng self.pnl = wx.Panel(self)
.
Vì vậy, dường như nó đã được hiển thị đúng cách, nhưng bitmap nằm bên dưới bảng điều khiển. Có lẽ? Tôi không chắc lắm. Tôi mới vào điều này toàn bộ wxPython.
Hình ảnh xuất hiện bên dưới bảng điều khiển là khả năng. Trừ khi bạn đặt rõ ràng vị trí của việc sử dụng một 'wx.Sizer' các đối tượng mặc định là (0,0). Đó là lý do tại sao tôi sử dụng một sizer ngay cả khi tôi chỉ có 1 mục. – acattle