Saya membuat antarmuka dua layar sederhana dengan Kivy untuk tugas klasifikasi gambar. Di layar pertama, saya memilih gambar menggunakan pemilih file dan menampilkannya. Di layar kedua, saya ingin menampilkan gambar yang sama dan hasil dari tugas klasifikasi. Transisi antar layar dilakukan melalui tombol di layar pertama.

Pertanyaan saya adalah: Ketika saya menekan tombol, bagaimana saya bisa memicu pembaruan properti sumber gambar di layar kedua, sehingga gambar yang dipilih akan ditampilkan di layar kedua? Bagian klasifikasi hanya untuk memahami latar belakang pertanyaan saya, saya tidak memasukkannya ke dalam kode.

Ini file main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty

class WindowManager(ScreenManager):
    image_source = StringProperty()
    def selected(self,filename):
        try:    
            self.image_source = filename[0]
        except:
            pass
    
# Screen where the image is selected
class ImageSelector(Screen):
    pass

# Display image & classification results
class ClassificationResultWindow(Screen):
    pass

class MainApp(App):
    def build(self):        
        self.image_selector = ImageSelector()
        self.scan_result_window = ClassificationResultWindow()

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

Dan ini file main.kv

#:kivy 2.0.0
WindowManager:
    ImageSelector:
    ClassificationResultWindow:

<ImageSelector>:
    name: "image_selector"
    id: image_selector
    BoxLayout:
        orientation: 'vertical'
        id: image_box
        FileChooserListView:
            id: filechooser
            on_selection: 
                root.manager.selected(filechooser.selection)
                print(root.manager.image_source)             
            size_hint: 1, 10           
        Image:
            id: image
            source: root.manager.image_source
            size_hint: 1, 4 
        Button:
            id: diagnose
            text: "Classify"
            on_release: 
                print(root.manager.image_source) 
                app.root.current = "classification_result"

<ClassificationResultWindow>:
    name: "classification_result"
    BoxLayout:
        orientation: 'vertical'
        id: box
        Image:
            id: scan
            source: root.manager.image_source
            size_hint: 1, 10        
        Label:
            text: "Here comes the classification result"
            font_size: 30
            size_hint: 1, 2
            id: label

Saya mencoba tanpa berhasil mengikat properti dengan cara yang berbeda, tetapi karena saya baru mengenal kivy, saya tidak tahu apakah itu masuk akal jadi saya tidak memasukkannya di sini.

0
aymer 7 Mei 2021, 10:14

1 menjawab

Jawaban Terbaik

Cara saya menangani penyampaian informasi dari satu layar ke layar lainnya adalah dengan membuat ScreenManager menahan properti, dan meminta Screen mengaksesnya.

File main.py Anda sekarang seharusnya:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty

class WindowManager(ScreenManager):
    image_source = StringProperty()

# Screen where the image is selected
class ImageSelector(Screen):
    pass

# Display image & classification results
class ClassificationResultWindow(Screen):
    pass

class MainApp(App):
    def build(self):        
        self.image_selector = ImageSelector()
        self.scan_result_window = ClassificationResultWindow()

if __name__ == "__main__":
    MainApp().run()
#:kivy 2.0.0
WindowManager:
    ImageSelector:
    ClassificationResultWindow:

<ImageSelector>:
    name: "image_selector"
    id: image_selector
    BoxLayout:
        orientation: 'vertical'
        id: image_box
        FileChooserListView:
            id: filechooser
            on_selection: 
                root.selected(filechooser.selection)             
            size_hint: 1, 10           
        Image:
            id: image
            source: root.manager.image_source
            size_hint: 1, 4 
        Button:
            id: diagnose
            text: "Classify"
            on_release: 
                app.root.current = "classification_result"

<ClassificationResultWindow>:
    name: "classification_result"
    BoxLayout:
        orientation: 'vertical'
        id: box
        Image:
            id: scan
            source: root.manager.image_source
            size_hint: 1, 10        
        Label:
            text: "Here comes the classification result"
            font_size: 30
            size_hint: 1, 2
            id: label

Apa yang sedang terjadi? Jadi pertama-tama StringProperty dibuat di ScreenManager. Pengikatan ke properti ini secara otomatis dibuat dan dengan demikian hal-hal yang mereferensikan properti ini akan diperbarui saat diubah.

Kemudian kelas Image di setiap Screen mereferensikan StringProperty ini hingga root.manager.image_source.

  • root adalah widget root,
  • manager adalah properti yang dimiliki setiap layar yang mengarahkannya ke induknya ScreenManager
  • image_source adalah properti yang kita buat sebelumnya.

Semoga ini membantu. Saya belum menguji di atas, jadi mungkin ada satu atau dua kesalahan, tapi saya pikir konsep umum memiliki ScreenManager memegang objek yang Screen perlu diteruskan satu sama lain adalah bagaimana saya memecahkan masalah ini.

1
jda5 7 Mei 2021, 09:50