Отображение растровых изображений одно за другим в wxpython в определенный момент перекрывает их и не отображает остальные - PullRequest
0 голосов
/ 14 декабря 2018

Я строю простую программу на Python, чтобы показать некоторые изображения, хранящиеся в некоторых папках.Программа переходит из папки в папку, показывая одно изображение за другим, например, так:

for x in range(len(gl)):
    for y in range(tn[x]):
        png = wx.Image("{}\\{}\\{}".format(username, gl[x], pnglist[tot + y]), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        delpng.append(wx.StaticBitmap(self.scrollWin, -1, png, (0, 56 * (tot + y)), (56, 56)))
    tot += tn[x]

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

Правильно отображаемые изображения

Перекрытие

Все изображения имеют ширину и высоту 56 пикселей.Я понятия не имею, что может быть причиной этого.

Для папок, которые он проходит: https://www.mediafire.com/file/l5t2uk9d2d1o7o0/GamerM3243.rar/file

А что касается кода:

import wx

#username = str(input("Username: "))
username = "GamerM3243"
delpng = []

def ShowImages(self, username):
    gl = []
    glif = [0]
    pnglist = []
    rpnglist = []
    tn = []

    fl = open("{}\\{}'s Trophies.txt".format(username, username), "r", encoding = "utf-8-sig").read().split('\n')
    self.scrollWin = wx.ScrolledWindow(self, -1, size = (700, 500))

    for i, n in enumerate(fl):
        if ''.join(list(n)[:25]) == "Number of trophies earned":
            gl.append(fl[i-1])
            tn.append(int(''.join(list(n)[27:])))

    glif = [i for i, n in enumerate(fl) if n in gl]

    for i, n in enumerate(gl):
        gl[i] = ''.join([x for x in list(n) if x != ":" and x != "?" and x != '"'])

    for i, n in enumerate(glif):
        i1 = n + 2
        try: 
            i2 = glif[i + 1] - 1      
        except IndexError:
            i2 = -1
        rpnglist.append(fl[i1:i2])

    for x in rpnglist:
        for y in x:
            if y != "" and y not in gl:
                pnglist.append(y)

    for i, n in enumerate(pnglist):
        for x, z in enumerate(list(n)):
            if z == "-" and n[x - 1] == " " and n[x + 1] == " ":
                pnglist[i] = ''.join(list(n)[:x - 1])

    for i, n in enumerate(pnglist):
        pnglist[i] = "{}.png".format(''.join([x for x in list(n) if x != ":" and x != "?" and x != '"']))

    tot = 0

    for x in range(len(gl)):
        for y in range(tn[x]):
                png = wx.Image("{}\\{}\\{}".format(username, gl[x], pnglist[tot + y]), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
                delpng.append(wx.StaticBitmap(self.scrollWin, -1, png, (0, 56 * (tot + y)), (56, 56)))
        tot += tn[x]

    self.scrollWin.SetScrollbars(0, 1, 1400, 56 * tot)
    self.Layout()
    self.Show(True) 

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title = title, size = (700, 500))
        ShowImages(self, username)

app = wx.App(False)
frame = MainWindow(None, "{}'s Trophies".format(username))
app.MainLoop()

Вам просто нужно распаковать файл, а затем поместить файл .py вне папки.Спасибо за помощь!

1 Ответ

0 голосов
/ 16 декабря 2018

------------ Редактировать -------------

Я запустилкодировать и печатать позиции объекта, и это выглядит так, как будто он достиг некоторого внутреннего предела в wxpython.Изображения достигают определенной координаты y, а затем просто складываются друг на друга.

Я попытался использовать прокрученный холст, а также добавить растровые изображения в классификатор, и все они дали примерно одинаковый результат.

Возможно, вам придется пересмотреть свой дизайн.Там может быть слишком много элементов для отображения без исчерпания ресурсов компьютера.Я бы порекомендовал разбивать изображения на страницы, чтобы не загружать слишком много изображений одновременно, или попытаться добавить их в listctrl в режиме LC_ICON.

Я обновил код для отображения, чтобы заполнить окно изображениями вместо одного столбца.Похоже, что отображать их все:

import wx

# username = str(input("Username: "))
username = "GamerM3243"
delpng = []


class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(700, 500))
        self.ShowImages(username)

    def ShowImages(self, username):
        gl = []
        glif = [0]
        pnglist = []
        rpnglist = []
        tn = []

        fl = open("{}\\{}'s Trophies.txt".format(username, username), "r", encoding="utf-8-sig").read().split('\n')
        self.scrollWin = wx.ScrolledWindow(self, -1, size=(700, 500))

        for i, n in enumerate(fl):
            if ''.join(list(n)[:25]) == "Number of trophies earned":
                gl.append(fl[i - 1])
                tn.append(int(''.join(list(n)[27:])))

        glif = [i for i, n in enumerate(fl) if n in gl]

        for i, n in enumerate(gl):
            gl[i] = ''.join([x for x in list(n) if x != ":" and x != "?" and x != '"'])

        for i, n in enumerate(glif):
            i1 = n + 2
            try:
                i2 = glif[i + 1] - 1
            except IndexError:
                i2 = -1
            rpnglist.append(fl[i1:i2])

        for x in rpnglist:
            for y in x:
                if y != "" and y not in gl:
                    pnglist.append(y)

        for i, n in enumerate(pnglist):
            for x, z in enumerate(list(n)):
                if z == "-" and n[x - 1] == " " and n[x + 1] == " ":
                    pnglist[i] = ''.join(list(n)[:x - 1])

        for i, n in enumerate(pnglist):
            pnglist[i] = "{}.png".format(''.join([x for x in list(n) if x != ":" and x != "?" and x != '"']))

        tot = 0

        col_count = self.GetSize()[0] // 56
        # col_wid = col_count * 56

        for x in range(len(gl)):
            for y in range(tn[x]):
                png = wx.Image("{}\\{}\\{}".format(username, gl[x], pnglist[tot + y]),
                               wx.BITMAP_TYPE_ANY).ConvertToBitmap()
                # print(56 * (tot + y))

                row, col = divmod(tot + y, col_count)
                pos = (56 * col, 56 * row)
                bmp = wx.StaticBitmap(self.scrollWin, -1, png, pos, (56, 56))

                delpng.append(bmp)

            tot += tn[x]
        self.scrollWin.SetScrollbars(0, 1, 1400, 56 * tot / col_count)
        self.Show()


app = wx.App(False)
frame = MainWindow(None, "{}'s Trophies".format(username))
app.MainLoop()

----------- Edit # 2 -------------

Следующий вопрос, вероятно, лучше подходит для CodeReview , но здесь быстрое переписывание с использованием только 1 цикла:

import wx, os

# username = str(input("Username: "))
username = "GamerM3243"
delpng = []
this_dir = os.path.abspath(".")
img_size = (56, 56)


def remove_illegal_chars(text):
    """
    :param text:
    :type text:
    :return: removes characters from a string that aren't allowed in windows filenames
    :rtype:
    """
    illegal = '":?/\<>|*'
    return "".join(c for c in text if c not in illegal)


def extract_fname(line_text):
    """
    :param line_text: a line of text from trophies.txt
    :type line_text:
    :return: the corresponding file name
    :rtype:
    """
    return remove_illegal_chars(line_text).split(" - Earned on")[0] + ".png"


def get_image_path(username, game_folder, line_text):
    """
    :param username:
    :type username:
    :param game_folder:
    :type game_folder:
    :param line_text:
    :type line_text:
    :return:
    :rtype:
    """
    return os.path.join(this_dir, username, game_folder, extract_fname(line_text))


class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(700, 500))
        self.scrollWin = None
        self.show_images(username)

    def show_images(self, username):
        self.scrollWin = wx.ScrolledWindow(self, -1, size=(700, 500))

        trophy_path = os.path.join(username, f"{username}'s Trophies.txt")
        with open(trophy_path, "r", encoding="utf-8-sig") as fileobj:
            lines = fileobj.read().split("\n")

        col_count = self.GetSize()[0] // img_size[0]
        last_line = None
        game_folder = None
        total_imgs = 0
        for line in lines:
            if line.startswith("Number of trophies earned"):
                # trophy count line, preceded by game title line
                game_folder = last_line
            elif "Earned on" in line:
                # trophy line
                img_path = get_image_path(username, game_folder, line)
                self.create_image(img_path, total_imgs, col_count)
                total_imgs += 1
            else:
                # possible game title
                last_line = remove_illegal_chars(line)
        self.scrollWin.SetScrollbars(0, 1, 1400, img_size[0] * total_imgs / col_count)
        self.Show()

    def create_image(self, img_path, img_number, col_count):
        bmp = wx.Bitmap(img_path)
        row, col = divmod(img_number, col_count)
        pos = (img_size[0] * col, img_size[0] * row)
        wx.StaticBitmap(self.scrollWin, -1, bmp, pos)


if __name__ == "__main__":
    try:
        app = wx.App(False)
        frame = MainWindow(None, "{}'s Trophies".format(username))
        app.MainLoop()
    except:
        import traceback

        traceback.print_exc()
        input()
...