0

特にマルチメディア アプリケーションに関しては、自分自身を経験豊富なプログラマーとは考えていませんが、この画像ビューアーを、画像をフルスクリーンで表示し、ユーザーが <- または -> を押すと画像が変化するようなプログラムを作成する必要がありました。矢印。

一般的なアイデアは、特定のフォルダー (imgs) に含まれるすべての画像が表示されるリストボックスを作成することでした。誰かがダブルクリックするか RETURN を押すと、最初にリストボックスで選択された画像を含む新しいフルスクリーン フレームが生成されます。ただし、ユーザーが矢印を押すと、通常の画像ビューアと同様に、画像が連続した順序で変化します。

最初に、最初の 15 ~ 20 枚の画像が生成されると、すべてがうまくいきます。その後、プログラムは依然として仲介者として機能しますが、非常に不快で非常に望ましくない効果が画像生成の間に現れます。画面にすばやく表示され、この後、右の連続した画像が表示されます。最初の出現では、その効果はほとんど目立ちませんが、しばらくすると、世代間でますます長くかかります.

誰かがリストボックスのエントリをダブルクリックしたときに実行されるコードは次のとおりです。

def lbclick(self, eve):
    frm = wx.Frame(None, -1, '')
    frm.ShowFullScreen(True)
    self.sel = self.lstb.GetSelection() # getting the selection from the listbox
    def pressk(eve):
        keys = eve.GetKeyCode()
        if keys == wx.WXK_LEFT:
            self.sel = self.sel - 1
            if self.sel < 0:
                self.sel = len(self.chk) - 1
            imgs() # invocking the function made for displaying fullscreen images when left arrow key is pressed
        elif keys == wx.WXK_RIGHT:
            self.sel = self.sel + 1
            if self.sel > len(self.chk) - 1:
               self.sel = 0
            imgs() # doing the same for the right arrow 
       elif keys == wx.WXK_ESCAPE:
            frm.Destroy()       
       eve.Skip()
    frm.Bind(wx.EVT_CHAR_HOOK, pressk)
    def imgs(): # building the function
        imgsl = self.chk[self.sel]
        itm = wx.Image(str('imgs/{0}'.format(imgsl)), wx.BITMAP_TYPE_JPEG).ConvertToBitmap() # obtaining the name of the image stored in the list          self.chk
        mar = itm.Size   # Because not all images are landscaped I had to figure a method to rescale them after height dimension, which is common to all images
        frsz = frm.GetSize()
        marx = float(mar[0])
        mary = float(mar[1])
        val = frsz[1] / mary
        vsize = int(mary * val)
        hsize = int(marx * val)
        panl = wx.Panel(frm, -1, size = (hsize, vsize), pos = (frsz[0] / 2 -  hsize / 2, 0)) # making a panel container
        panl.SetBackgroundColour('#000000')
        imag = wx.Image(str('imgs/{0}'.format(imgsl)), wx.BITMAP_TYPE_JPEG).Scale(hsize, vsize, quality = wx.IMAGE_QUALITY_NORMAL).ConvertToBitmap()
        def destr(eve): # unprofessionaly trying to destroy the panel container when a new image is generated hopeing the unvanted effect, with previous generated images will disappear. But it doesn't.
            keycd = eve.GetKeyCode()
            if keycd == wx.WXK_LEFT or keycd == wx.WXK_RIGHT:
                try:
                    panl.Destroy()
                except:
                    pass
            eve.Skip()
        panl.Bind(wx.EVT_CHAR_HOOK, destr) # the end of my futile tries
        if vsize > hsize: # if the image is portrait instead of landscaped I have to put a black image as a container, otherwise in the background the previous image will remain, even if I use Refresh() on the container (the black bitmap named fundal)
            intermed = wx.Image('./res/null.jpg', wx.BITMAP_TYPE_JPEG).Scale(frsz[0], frsz[1]).ConvertToBitmap()
            fundal = wx.StaticBitmap(frm, 101, intermed)
            stimag = wx.StaticBitmap(fundal, -1, imag, size = (hsize, vsize), pos = (frsz[0] / 2 -  hsize / 2, 0))
            fundal.Refresh()
            stimag.SetToolTip(wx.ToolTip('Esc = exits fullscreen\n<- -> arrows = quick navigation'))
            def destr(eve): # the same lame attempt to destroy the container in the portarit images situation
                keycd = eve.GetKeyCode()
                if keycd == wx.WXK_LEFT or keycd == wx.WXK_RIGHT:
                    try:
                        fundal.Destroy()
                    except:
                        pass
                eve.Skip()
            frm.Bind(wx.EVT_CHAR_HOOK, destr)
        else: # the case when the images are landscape
            stimag = wx.StaticBitmap(panl, -1, imag)
            stimag.Refresh()
            stimag.SetToolTip(wx.ToolTip('Esc = exits fullscreen\n<- -> arrows = quick navigation'))
    imgs() # invocking the function imgs for the situation when someone does double click
    frm.Center()
    frm.Show(True)

事前にアドバイスをありがとう。

後で追加:

問題は、たくさんの画像を含む DVD の自動実行プレゼンテーションを実行しようとしているということです。とにかく、他のオプションがある場合、上記のコードを適切に機能させる必要はありません。私はすでにWindowsの画像ビューアを使用しようとしましたが、奇妙なことに相対パスを認識せず、これを行うと

path = os.getcwd() # getting the path of the current working directory
sel = listbox.GetSelection() # geting the value of the current selection from the list box
imgname = memlist[sel] # retrieving the name of the images stored in a list, using the listbox selection, that uses as choices the same list
os.popen(str('rundll32.exe C:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen {0}/imgsdir/{1}'.format(path, imgname))) # oepning the images up with bloody windows image viewer

プログラムがハードディスク上にある場合にのみイメージを開きます。CD /イメージドライブ上にある場合は何もしません。

4

1 に答える 1

0

wxPython デモ パッケージには画像ビューアーが含まれています。私はまた、本当に簡単なものをここに書きました。どちらかがあなたの旅に役立つはずです。パネル/フレームを再利用しておらず、適切に破壊されていない古いものを見ているのではないかと思います。

于 2012-07-09T13:40:54.663 に答える