Используя экраны Kivy, как изменить метку с экрана 2 на основе текста нажатой кнопки на экране 1?

Я использую 2 файла с этим процессом, первый из которых main.py, а второй ScreenManagement.kv Я пробовал так много разных «решений» из Stack и других сайтов, но у меня ничего не работает. Я хочу иметь возможность нажать кнопку, и кнопка перенесет меня на следующий экран, а также установить метку на этом экране в текст кнопки с первого экрана.

Я пометил кнопку, метку и рассматриваемые экраны комментариями. Заранее спасибо за вашу помощь, так как это постоянная проблема :)

main.py

from kivy.app import App
from kivy.graphics import Color, Rectangle
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.colorpicker import ColorPicker
from py.fileImport import readMachine
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager, NoTransition
from kivy.properties import StringProperty

Builder.load_file("kv/ScreenManagement.kv")

class MainOverview(Screen): #This is the first screen in question
    selectedMachine = StringProperty("")
class MachineStatusPage(Screen): #This is the second screen in question
    selectedMachine = StringProperty("test")
class AddMachinePage(Screen):
    pass
class AddJobPage(Screen):
    pass

class MainApp(App):   

    def build(self):
        
        self.root = root = ScreenManager()
        root.bind(size=self._update_rect, pos=self._update_rect)
        screen1 = MainOverview(name='MainOverview')
        screen2 = MachineStatusPage(name='MachineStatusPage')
        screen3 = AddMachinePage(name='AddMachinePage')
        screen4 = AddJobPage(name='AddJobPage')
        root.add_widget(screen1)
        root.add_widget(screen2)
        root.add_widget(screen3)
        root.add_widget(screen4)
        

        with root.canvas.before:
            Color(0, 1, 1, .6)  # colors range from 0-1 not 0-255
            self.rect = Rectangle(size=root.size, pos=root.pos)
        return root

    def _update_rect(self, instance, value):
        self.rect.pos = instance.pos
        self.rect.size = instance.size

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

ScreenManagement.kv

#:kivy 1.10.1
#: import NoTransition kivy.uix.screenmanager.NoTransition

<AnchorGridCell@AnchorLayout>:
    anchor_x: 'center'
    anchor_y: 'center'
<SubmitButton@Button>:
    text: 'Submit'
    font_size: self.width / 8
    size_hint: .4, .1
<CancelButton@Button>:
    text: 'Cancel'
    font_size: self.width / 8
    size_hint: .4, .1
<MachineButton@Button>:
    font_size: self.width / 20
    text_size: self.size
    halign: 'center'
    valign: 'center'
<MachineStatusButton@Button>:
    font_size: self.width / 9
    text_size: self.size
    halign: 'center'
    valign: 'center'
    size_hint: .3, .06
<XButton@Button>:
    text: 'X'
    size_hint: None, None
<InputLabel@Label>:
    font_size: self.width / 8
    text_size: self.size
    halign: 'left'
    valign: 'center'
<OutputLabel@Label>:
    font_size: self.width / 8
    text_size: self.size
    halign: 'right'
    valign: 'center'
<TextCollection@TextInput>:
    multiline: False
    size_hint: 1, .7
    font_size: self.width / 7
    
<ScreenManager>
    transition: NoTransition()
    MainOverview:
        id: mainOverview
    MachineStatusPage:
        selectedMachine: mainOverview.selectedMachine
<MainOverview>:
    FloatLayout:
        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'top'
            GridLayout:
                cols: 1
                row_force_default: True
                row_default_height: self.width / 13
                padding: self.width / 15
                AnchorLayout:
                    anchor_x: 'center'
                    anchor_y: 'bottom'
                    Label:
                        text: 'All Currently Added Machines'
                        text_size: self.size
                        font_size: self.width / 16
                        halign: 'center'
                        valign: 'bottom'
                AnchorLayout:
                    anchor_x: 'center'
                    anchor_y: 'top'
                    GridLayout:
                        cols: 1
                        row_force_default: True
                        row_default_height: self.width / 8
                        col_default_width: self.width / 4
                        padding: self.width / 25
                        spacing: self.width / 25, self.width / 50
                        AnchorGridCell:

###############################################################################

                            MachineButton: #This button is the one in question
                                id: machine1
                                text: "Tsugami 5"
                                on_press: root.selectedMachine = machine1.text; root.manager.current = 'MachineStatusPage'

###############################################################################

                        AnchorGridCell:
                            MachineButton:
                                text: 'Tsugami 6'
                                on_press: root.manager.current = 'MachineStatusPage'
                        AnchorGridCell:
                            MachineButton:
                                text: 'Tsugami 7'
                                on_press: root.manager.current = 'MachineStatusPage'
                        AnchorGridCell:
                            MachineButton:
                                text: 'Tsugami 8'
                                on_press: root.manager.current = 'MachineStatusPage'
            AnchorLayout:
                anchor_x: 'right'
                anchor_y: 'bottom'
                MachineButton:
                    text: 'Add New Machine'
                    font_size: self.width / 8
                    size_hint: .4, .1
                    on_press: root.manager.current = 'AddMachinePage'
                                    
                                
<MachineStatusPage>:
    FloatLayout:
        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'top'
            GridLayout:
                cols: 1
                rows: 2
                row_force_default: True
                row_default_height: self.width / 13
                padding: self.width / 8
                AnchorLayout:
                    anchor_x: 'center'
                    anchor_y: 'bottom'

#####################################################################

                    Label: #This label is the label in question
                        id: selectedMachine
                        text: root.selectedMachine
                        text_size: self.size
                        font_size: self.width / 12
                        halign: 'center'
                        valign: 'bottom'

#####################################################################

                AnchorLayout:
                    anchor_x: 'center'
                    anchor_y: 'top'
                    GridLayout:
                        cols: 2
                        row_force_default: True
                        row_default_height: self.width / 8
                        col_default_width: self.width / 4
                        padding: self.width / 25
                        spacing: self.width / 25, self.width / 50
                        AnchorGridCell:
                            InputLabel:
                                text: 'Current Job: '
                        AnchorGridCell:
                            OutputLabel:
                                text: '414-44-1'
                        AnchorGridCell:
                            InputLabel:
                                text: 'Parts Left: '
                        AnchorGridCell:
                            OutputLabel:
                                text: '250'
                        AnchorGridCell:
                            InputLabel:
                                text: 'Time Left: '
                        AnchorGridCell:
                            OutputLabel:
                                text: '3 Days'
            AnchorLayout:
                anchor_x: 'left'
                anchor_y: 'bottom'
                Button:
                    text: 'Go Back'
                    font_size: self.width / 8
                    size_hint: .4, .1
                    on_press: root.manager.current = 'MainOverview'
            AnchorLayout:
                anchor_x: 'right'
                anchor_y: 'bottom'
                Button:
                    text: 'Add New Job'
                    font_size: self.width / 8
                    size_hint: .4, .1
                    on_press: root.manager.current = 'AddJobPage'

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать метод get_screen или attr. current_screen для доступа к любому экрану, добавленному в ScreenManager (ваш виджет root), как,

                            MachineButton: #This button is the one in question
                                id: machine1
                                text: "Tsugami 5"
                                on_press:
                                    root.manager.current = 'MachineStatusPage'
                                    root.manager.current_screen.selectedMachine = self.text
                                    # Or,
                                    # root.manager.get_screen('MachineStatusPage').selectedMachine = self.text

Также я думаю, что вам не нужны следующие строки кода, поскольку вы уже определили root в методе build.

<ScreenManager> # Naming dynamic class with default class name is discouraged.
    transition: NoTransition()
    MainOverview:
        id: mainOverview
    MachineStatusPage:
        selectedMachine: mainOverview.selectedMachine

Как бы я определил переход в файле python в методе сборки?

Michael Jetzer 15.05.2022 22:34

Просто передайте его как значение для kwarg transition of ScreenManager as, transition = NoTransition().

ApuCoder 16.05.2022 07:09

Другие вопросы по теме