Почему я не могу рисовать на двух разных растровых изображениях в wxPython?

#python #wxpython

Вопрос:

Я пытаюсь нарисовать кнопку на растровом объекте. В зависимости от положения y, он должен использовать растровое изображение 1, если положение y находится в пределах значения высоты bmp1, и растровое изображение 2, если это не так. По какой-то причине это не работает:

 wx.Button(bitmap1 if ypos <= bmp1.GetHeight() else bitmap2, label='Run', id=i, pos=(xpos, ypos))
 

Я могу нарисовать кнопку только на одном изображении wx.StaticBitmap или на панели. Родители изображений-это панель.

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

Что это дает?

ПРИМЕЧАНИЕ: Мне удалось обойти это, используя PIL, чтобы создать динамическое изображение, достаточно большое, чтобы разместить мои сгенерированные кнопки (непрерывный размер y, в зависимости от их количества и размещения), однако эта идея/код все равно должны быть действительны.

Если я заменю значение «растровое изображение 2» для панели и немного сдвину изображение растрового изображения 2, нарисованное на панели, то я увижу, что программа рисует под растровым изображением 2. Почему? Изображение размещено точно так же, как растровое изображение 1, и у растрового изображения 1 нет проблем с отображением на нем кнопок? :O

Комментарии:

1. Честно говоря, я ошеломлен тем, что вы can включили if утверждение в определение кнопки, что привело к большой путанице с моей стороны, но вы не можете просто сделать любой виджет child из любого другого виджета. parent Виджет должен быть способен обрабатывать child виджеты, например wx.Frame , и wx.Panel . Я готов исправиться в этом, так как вам уже удалось выполнить то, что я считал невозможным. 😉

2. @RolfofSaxony-это достаточно веская причина для понижения голоса? В любом случае — вы можете сделать это здесь, как видите. Однако моя проблема в том, что рисунок, по-видимому, может быть выполнен только на одной картинке и панели, но не на той или иной картинке. Я делаю именно это — назначаю, на каком родителе рисовать, но, похоже, он не хочет рисовать на двух изображениях, если одно из них завершено. Я генерирую n кнопок. Какая-нибудь помощь?

3. @RolfofSaxony Я добавил заметку с дополнительным контекстом, если это поможет в процессе размышлений

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

Ответ №1:

Я разобрался в проблеме:

Родительский объект кнопки должен получать ypo в соответствии с размерами родителя, а не в том месте, где он нарисован на рамке, например так:

 wx.Button(bitmap1 if ypos <= bmp1.GetHeight() else bitmap2, label='Run {i}', id=i, pos=(80, ypos if ypos <= bmp1.GetHeight() else ypos-img_height))
 

да, если да,

Наконец-то!

Комментарии:

1. Отличная работа! Однако подумайте о создании переменных для растрового изображения, положения и т. Д., Поскольку этот метод вполне может оказаться менее чем ремонтопригодным. Это очень странный способ делать вещи, но если вам это удобно, прекрасно. Питон доказывает, что существует множество способов освежевать кошку.

2. @RolfofSaxony Я думаю, что это была ошибка с моей стороны, но я ошибочно предположил, что рисунок был в абсолютных координатах кадра для обоих изображений. Я был неправ, потому что у кнопок есть их родитель, но это обрабатывалось в цикле, и я немного растерялся. Схема координат, которую я использую, достаточно проста в обслуживании с 7-10 переменными. Большинство элементов в моем пользовательском интерфейсе генерируются в соответствии с отсканированным путем, поэтому имеет смысл создать цикл и сделать его динамичным.