Изображение Kivy reload () не обновляется в окне приложения - PullRequest
0 голосов
/ 23 октября 2019

В настоящее время я делаю приложение на Python, используя Kivy и KivyMD для пользовательского интерфейса. Основная идея моего приложения заключается в том, что пользователь нажимает кнопку, и в окне приложения появляется изображение QR-кода. Если пользователь снова нажимает кнопку, должно появиться новое изображение QR-кода. Я пытаюсь использовать функцию Kivy reload() для обновления изображения QR-кода, но оно обновляет только изображение в каталоге, а не в окне приложения.

Строка загрузки Kivy Builder:

 Window.size = (320, 500)

 main_kv = """

 BoxLayout:
     orientation: 'vertical'
      size_hint_y: None
      height: self.minimum_height
      spacing: dp(10)
 MDLabel:
      font_name: 'Roboto-Italic'
      theme_text_color: 'Primary'
      text: "Public Key:"
      halign: 'center'
      pos_hint: {'center_x': .5, 'center_y': .90}
      font_size: 20
 Image:
      id:qr
      source: 'qr.jpg'
      size: self.texture_size
 MDLabel:
      font_name: 'Roboto-Italic'
      theme_text_color: 'Primary'
      text: "Private Key:"
      halign: 'center'
      pos_hint: {'center_x': .5, 'center_y': .50}
      font_size: 20

 MDRectangleFlatIconButton:
      text: "Generate Keys"
      icon: 'polymer'
      opposite_colors: True
      pos_hint: {'center_x': .5 , 'center_y': .08}
      elevation: 10
      on_press: app.b32Keys()
      opposite_colors: True


"""

Код Python:

class KnixBTC(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = 'DeepPurple'
    theme_cls.accent_palette = 'Orange'
    theme_cls.theme_style = 'Dark'

    def build(self):
        self.main_widget = Builder.load_string(main_kv)
        return self.main_widget

    def b32Keys(self):
        image = Image(source='qr.jpg', nocache=True)
        privateKey = PrivateKey.random()
        private = privateKey.wif(compressed=True)
        publicKey = privateKey.to_public()
        bech32 = publicKey.to_address('P2WPKH')
        genQR = qrcode.make(bech32)
        genQR.save("qr.jpg")
        image.reload()


if __name__ == "__main__":
    KnixBTC().run()

1 Ответ

0 голосов
/ 23 октября 2019

image отличается от qr, первое создается каждый раз, когда вызывается функция b32Keys, а второе - показанное, поэтому перезагрузка image не перезагружает qr. Таким образом, решение состоит в том, чтобы получить доступ к qr напрямую, в этом случае вы должны использовать root и id:

def b32Keys(self):
    privateKey = PrivateKey.random()
    private = privateKey.wif(compressed=True)
    publicKey = privateKey.to_public()
    bech32 = publicKey.to_address('P2WPKH')
    genQR = qrcode.make(bech32)
    genQR.save("qr.jpg")
    <b>self.main_widget.ids.qr.reload()</b>
...