从类中获取价值到另一个 Python

Posted

技术标签:

【中文标题】从类中获取价值到另一个 Python【英文标题】:Getting value from class to an other Python 【发布时间】:2021-11-04 02:01:48 【问题描述】:

我正在使用 Kivy 为我的密码管理器创建图形界面。 我已经制作了登录页面。我不知道如何将我的密码登录上传到另一个文件中的其他班级以解密我的其他密码?

class MainApp(MDApp):


def build(self):

    self.theme_cls.theme_style = "Dark"
    self.theme_cls.primary_palette = "BlueGray"

    return Builder.load_file('libs\kv\login_page.kv')


def logger(self):
    try : 
        passwd = verif_password(self.root.ids.password.text)
        passwd_bdd = passwd

        if passwd == True : 
            self.get_running_app().stop()
            import graphical_password 
        
        else :
            print("NO")
    
    except :
        print("No passs")
 MainApp().run()

我的 Import graphics_password 是这个代码:

class MainApp(MDApp):
def build(self):

    screen = Screen()

    table = MDDataTable(
        pos_hint = 'center_x' : 0.5, 'center_y' : 0.5,
        size_hint = (0.9, 0.6),
        check = True,
        column_data  =[
            ("F_name", dp(30)),
            ("Name", dp(30)),
            ("Mail", dp(30)),
            ("Phone", dp(30)),
        ],
        row_data = [
            ("P1","P2","GAMIL","0658"),
            ("P3","P4","GAMIL","0658"),
        ]
    )
    self.theme_cls.theme_style = "Light"
    self.theme_cls.primary_palette = "BlueGray"


    screen.add_widget(table)
    return screen

MainApp().run()

你知道如何将我在第一页输入的密码输入到另一页吗?

【问题讨论】:

为什么你有两个继承自 MDApp 的类,即这两个不同的应用程序? 【参考方案1】:

用途:

ma​​in.py

from kivymd.app import MDApp
from graphical_password import Screen_jbsidis
from graphical_password import *
from kivy.lang import Builder
from kivy.clock import Clock
def verif_password(a): return True
class MainAppjbsidis(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.passs=""
        self.user=""
        self.mainx_jbsidis=Builder.load_file('libs/kv/login_page.kv')
    def build(self):
        global passs
        global user
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "BlueGray"
        return self.mainx_jbsidis
    def logger(self,user,pasword_jbsidis):
        try:
            print(user.text,pasword_jbsidis.text)
            self.passs=pasword_jbsidis.text
            self.user=user.text
            passwd = verif_password(pasword_jbsidis.text)
            passwd_bdd = passwd
            if passwd == True : 
                jbsidis="self.get_running_app().stop() #this is an issue because this may kill the thread and not execute the next one, plus it may use additional unnecessary memory"
                jbsidis5="import graphical_password "
                jbsidis6="self.mainx_jbsidis.ids.jbsidisBody.add_widget(Screen_jbsidis())"
                self.mainx_jbsidis.ids.jbsidisBody.current="dos"
            else :
                print("NO")
        except Exception as e:
            print("No passs",str(e))
    def put_data(self,TABLE):
        kar="""
        TABLE.data=[]
        new_datax=[
            'text': self.passs, 'Index': 'P1', 'range': [0, 3], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': self.user, 'Index': 'P1', 'range': [0, 3], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': 'jbsidis', 'Index': 'P1', 'range': [0, 3], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': '8822', 'Index': 'P1', 'range': [0, 3], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,

            'text': 'MyOtherPassword', 'Index': 'P3', 'range': [4, 7], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': 'MyNameA', 'Index': 'P3', 'range': [4, 7], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': 'jbsidis555', 'Index': 'P3', 'range': [4, 7], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData,
            'text': '2222', 'Index': 'P3', 'range': [4, 7], 'selectable': True, 'viewclass': 'CellRow', 'table': TableData
            ]
        TABLE.data.append(new_datax)
        TABLE.table_data.recycle_data=[]
        row_dataZ = [
            (self.passs,self.user,"jbsidis","1111"),
            ("AnotherPASS","OtherUser","jbsidis767","23232"),
        ]
        TABLE.table_data=TableData(
            TABLE.header,
            row_data=row_dataZ,
            check=True,
            rows_num=2,
            _parent=TABLE,
        )
        """
        self.mainx_jbsidis.ids.TABLE_EXTRA_jbsidis.clear_widgets()
        self.table_refresher_jbsidis()
    def table_refresher_jbsidis(self):
        self.tablejbsidis = MDDataTable(
            pos_hint = 'center_x' : 0.5, 'center_y' : 0.5,
            size_hint = (0.9, 0.6),
            check = True,
            column_data  =[
                ("Password", dp(30)),
                ("User", dp(30)),
                ("Mail", dp(30)),
                ("Phone", dp(30)),
            ],
            row_data = [
                (self.passs,self.user,"jbsidis","062328"),
                ("Otherpass","OtherUser","jbsidis222","2222"),
            ]
        )
        self.mainx_jbsidis.ids.TABLE_EXTRA_jbsidis.add_widget(self.tablejbsidis)
    def constant_checker(self):
        if self.passs!="" and self.user!="":
            T=self.mainx_jbsidis.ids.TABLE_EXTRA_jbsidis.children
            jbsidis223="print(T)"
            jbsidis55333="[<graphical_password.MDDataTable object at 0x7f5a5dfe8740>]"
            new_data= [
                (self.passs,self.user,"jbsidis","06655")
                ,(self.passs,self.user,"jbsidis2","06655")]
            
            Clock.schedule_once(lambda x:self.put_data(T[0]),3)

MainAppjbsidis().run()

libs/kv/login_page.kv

#:import Screen_jbsidis graphical_password.Screen_jbsidis
Screen:
    ScreenManager:
        id: jbsidisBody
        Screen:
            name: "uno_jbsidis"
            FloatLayout:
                BoxLayout:
                    orientation: "vertical"
                    padding: dp(30)
                    BoxLayout:
                    BoxLayout:
                    MDTextField:
                        id: jbsidis1
                        pos_hint: "center_x": .5, "center_y": .5
                        hint_text: "User"
                    MDTextField:
                        id: jbsidis2
                        pos_hint: "center_x": .5, "center_y": .5
                        hint_text: "Password"
                    MDTextButton:
                        id: jbsidis3
                        pos_hint: "center_x": .5, "center_y": .5
                        text: "Forgot password?"
                    MDFillRoundFlatButton:
                        id: jbsidis4
                        pos_hint: "center_x": .5, "center_y": .5
                        text: "Login"
                        on_release:
                            app.logger(root.ids.jbsidis1,root.ids.jbsidis2)
                            app.constant_checker()
                    BoxLayout:
                    BoxLayout:
        Screen_jbsidis:
            id: TABLE_EXTRA_jbsidis
            name: "dos"

graphical_password.py

from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
from kivy import Logger
from kivy.metrics import dp
from kivy.properties import (
    BooleanProperty,
    ListProperty,
    ObjectProperty,
    NumericProperty,
    DictProperty,
    StringProperty,
    OptionProperty,
)
from kivy.clock import Clock
from kivy.uix.scrollview import ScrollView
from kivy.uix.behaviors import FocusBehavior, ButtonBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.recyclegridlayout import RecycleGridLayout
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivymd.theming import ThemableBehavior
from kivymd.uix.behaviors import HoverBehavior
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.dialog import BaseDialog
from kivymd.uix.tooltip import MDTooltip
from kivymd.uix.menu import MDDropdownMenu
Builder.load_string(
    """
#:import DEVICE_TYPE kivymd.material_resources.DEVICE_TYPE
<CellRow>
    orientation: "vertical"
    canvas.before:
        Color:
            rgba:
                (root.theme_cls.bg_darkest if root.theme_cls.theme_style == "Light" else root.theme_cls.bg_light) \
                if self.selected else root.theme_cls.bg_normal
        Rectangle:
            pos: self.pos
            size: self.size
    on_press: if DEVICE_TYPE != "desktop": root.table.on_mouse_select(self)
    on_enter: if DEVICE_TYPE == "desktop": root.table.on_mouse_select(self)
    MDBoxLayout:
        id: box
        padding: "8dp", "8dp", 0, "8dp"
        spacing: "16dp"
        MDCheckbox:
            id: check
            size_hint: None, None
            size: 0, 0
            opacity: 0
            on_active: root.select_check(self.active)
        MDLabel:
            id: label
            text: " " + root.text
            color: (1, 1, 1, 1) if root.theme_cls.theme_style == "Dark" else (0, 0, 0, 1)
<CellHeader>
    orientation: "vertical"
    size_hint_y: None
    height: self.minimum_height
    spacing: "4dp"
    tooltip_text: root.text
    MDLabel:
        text: " " + root.text
        size_hint_y: None
        height: self.texture_size[1]
        bold: True
        color: (1, 1, 1, 1) if root.theme_cls.theme_style == "Dark" else (0, 0, 0, 1)
    MDSeparator:
        id: separator
<TableHeader>
    bar_width: 0
    do_scroll: False
    size_hint: 1, None
    height: header.height
    MDGridLayout:
        id: header
        rows: 1
        cols_minimum: root.cols_minimum
        adaptive_size: True
        padding: 0, "8dp", 0, 0
        MDBoxLayout:
            orientation: "vertical"
            MDBoxLayout:
                id: box
                padding: "8dp", "8dp", "4dp", 0
                spacing: "16dp"
                MDCheckbox:
                    id: check
                    size_hint: None, None
                    size: 0, 0
                    opacity: 0
                    on_active: root.table_data.select_all(self.state)
                    disabled: True
                CellHeader:
                    id: first_cell
            MDSeparator:
<TableData>
    data: root.recycle_data
    data_first_cells: root.data_first_cells
    key_viewclass: "viewclass"
    TableRecycleGridLayout:
        id: row_controller
        key_selection: "selectable"
        cols: root.total_col_headings
        cols_minimum: root.cols_minimum
        default_size: None, dp(52)
        default_size_hint: 1, None
        size_hint: None, None
        height: self.minimum_height
        width: self.minimum_width
        orientation: 'lr-tb'
        multiselect: True
        touch_multiselect: True
<TablePagination>
    adaptive_height: True
    spacing: "8dp"
    Widget:
    MDLabel:
        text: "Rows per page"
        size_hint: None, 1
        width: self.texture_size[0]
        text_size: None, None
        font_style: "Caption"
        color: (1, 1, 1, 1) if root.theme_cls.theme_style == "Dark" else (0, 0, 0, 1)
    MDDropDownItem:
        id: drop_item
        pos_hint: 'center_y': .5
        text: str(root.table_data.rows_num)
        font_size: "14sp"
        on_release: root.table_data.open_pagination_menu()
    Widget:
        size_hint_x: None
        width: "32dp"
    MDLabel:
        id: label_rows_per_page
        text: f"1-root.table_data.rows_num of len(root.table_data.row_data)"
        size_hint: None, 1
        #width: self.texture_size[0]
        text_size: None, None
        font_style: "Caption"
        color: (1, 1, 1, 1) if root.theme_cls.theme_style == "Dark" else (0, 0, 0, 1)
    MDIconButton:
        id: button_back
        icon: "chevron-left"
        user_font_size: "20sp"
        pos_hint: 'center_y': .5
        disabled: True
        on_release: root.table_data.set_next_row_data_parts("back")
    MDIconButton:
        id: button_forward
        icon: "chevron-right"
        user_font_size: "20sp"
        pos_hint: 'center_y': .5
        on_release: root.table_data.set_next_row_data_parts("forward")
<MDDataTable>
    MDCard:
        id: container
        orientation: "vertical"
        elevation: 14
        md_bg_color: 0, 0, 0, 0
        padding: "24dp", "24dp", "8dp", "8dp"
        canvas:
            Color:
                rgba: root.theme_cls.bg_normal
            RoundedRectangle:
                pos: self.pos
                size: self.size
""")
class TableRecycleGridLayout(
    FocusBehavior, LayoutSelectionBehavior, RecycleGridLayout
):
    selected_row = NumericProperty(0)
    table_data = ObjectProperty(None)
    def get_nodes(self):
        nodes = self.get_selectable_nodes()
        if self.nodes_order_reversed:
            nodes = nodes[::-1]
        if not nodes:
            return None, None
        selected = self.selected_nodes
        if not selected:
            self.selected_row = 0
            self.select_row(nodes)
            return None, None
        if len(nodes) == 1:
            return None, None
        index = selected[-1]
        if index > len(nodes):
            last = len(nodes)
        else:
            last = nodes.index(index)
        self.clear_selection()
        return last, nodes
    def select_next(self, instance):
        """Select next row."""
        self.table_data = instance
        last, nodes = self.get_nodes()
        if not nodes:
            return
        if last == len(nodes) - 1:
            self.selected_row = nodes[0]
        else:
            self.selected_row = nodes[last + 1]
        self.selected_row += self.table_data.total_col_headings
        self.select_row(nodes)
    def select_current(self, instance):
        self.table_data = instance
        last, nodes = self.get_nodes()
        if not nodes:
            return
        self.select_row(nodes)
    def select_row(self, nodes):
        col = self.table_data.recycle_data[self.selected_row]["range"]
        for x in range(col[0], col[1] + 1):
            self.select_node(nodes[x])
class CellRow(
    ThemableBehavior,
    RecycleDataViewBehavior,
    HoverBehavior,
    ButtonBehavior,
    BoxLayout,
):
    text = StringProperty()
    table = ObjectProperty()
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)
    def on_table(self, instance, table):
        if not table.check:
            self.ids.box.padding = 0
            self.ids.box.spacing = 0
    def refresh_view_attrs(self, table_data, index, data):
        self.index = index
        return super().refresh_view_attrs(table_data, index, data)
    def on_touch_down(self, touch):
        if super().on_touch_down(touch):
            if self.table._parent:
                self.table._parent.dispatch("on_row_press", self)
            return True
    def apply_selection(self, table_data, index, is_selected):
        self.selected = is_selected
        if table_data.check:
            if self.text in table_data.data_first_cells:
                self.ids.check.size = (dp(32), dp(32))
                self.ids.check.opacity = 1
                self.ids.box.spacing = dp(16)
                self.ids.box.padding[0] = dp(8)
            else:
                self.ids.check.size = (0, 0)
                self.ids.check.opacity = 0
                self.ids.box.spacing = 0
                self.ids.box.padding[0] = 0
        if table_data._rows_number in table_data.current_selection_check:
            for index in table_data.current_selection_check[
                table_data._rows_number
            ]:
                if (
                    self.index
                    in table_data.current_selection_check[
                        table_data._rows_number
                    ]
                ):
                    self.ids.check.state = "down"
                else:
                    self.ids.check.state = "normal"
        else:
            self.ids.check.state = "normal"
    def select_check(self, active):
        if active and self.index not in self.table.current_selection_check:
            if (
                not self.table._rows_number
                in self.table.current_selection_check
            ):
                self.table.current_selection_check[self.table._rows_number] = []
            if (
                self.index
                not in self.table.current_selection_check[
                    self.table._rows_number
                ]
            ):
                self.table.current_selection_check[
                    self.table._rows_number
                ].append(self.index)
        else:
            if self.table._rows_number in self.table.current_selection_check:
                if (
                    self.index
                    in self.table.current_selection_check[
                        self.table._rows_number
                    ]
                    and not active
                ):
                    self.table.current_selection_check[
                        self.table._rows_number
                    ].remove(self.index)
        self.table.get_select_row(self.index)
class CellHeader(MDTooltip, BoxLayout):
    text = StringProperty()
class TableHeader(ScrollView):
    table_data = ObjectProperty()
    column_data = ListProperty()
    col_headings = ListProperty()
    sort = BooleanProperty(False)
    cols_minimum = DictProperty()
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        for i, col_heading in enumerate(self.column_data):
            self.cols_minimum[i] = col_heading[1] * 5
            self.col_headings.append(col_heading[0])
            if i:
                self.ids.header.add_widget(
                    CellHeader(text=col_heading[0], width=self.cols_minimum[i])
                )
            else:
                self.ids.first_cell.text = col_heading[0]
                self.ids.first_cell.ids.separator.height = 0
                self.ids.first_cell.width = self.cols_minimum[i]
    def on_table_data(self, instance, value):
        if self.table_data.check:
            self.ids.check.size = (dp(32), dp(32))
            self.ids.check.opacity = 1
        else:
            self.ids.box.padding[0] = 0
            self.ids.box.spacing = 0
    def on_sort(self, instance, value):
        Logger.info("TableData: Sorting table items is not implemented")
class TableData(RecycleView):
    recycle_data = ListProperty()
    data_first_cells = ListProperty()
    row_data = ListProperty()
    total_col_headings = NumericProperty(0)
    cols_minimum = DictProperty()
    table_header = ObjectProperty()
    pagination_menu = ObjectProperty()
    pagination = ObjectProperty()
    check = ObjectProperty()
    rows_num = NumericProperty()
    pagination_menu_open = BooleanProperty(False)
    current_selection_check = DictProperty()
    sort = BooleanProperty()
    _parent = ObjectProperty()
    _rows_number = NumericProperty(0)
    _rows_num = NumericProperty()
    _current_value = NumericProperty(1)
    _to_value = NumericProperty()
    _row_data_parts = ListProperty()
    def __init__(self, table_header, **kwargs):
        super().__init__(**kwargs)
        self.table_header = table_header
        self.total_col_headings = len(table_header.col_headings)
        self.cols_minimum = table_header.cols_minimum
        self.set_row_data()
        Clock.schedule_once(self.set_default_first_row, 0)
    def get_select_row(self, index):
        row = []
        for data in self.recycle_data:
            if index in data["range"]:
                row.append(data["text"])
        self._parent.dispatch("on_check_press", row)
    def set_default_first_row(self, dt):
        self.ids.row_controller.select_next(self)
    def sort_by_name(self):
        print(1)
    def set_row_data(self):
        data = []
        low = 0
        high = self.total_col_headings - 1
        self.recycle_data = []
        self.data_first_cells = []
        if self._row_data_parts:
            for row in self._row_data_parts[self._rows_number]:
                for i in range(len(row)):
                    data.append([row[i], row[0], [low, high]])
                low += self.total_col_headings
                high += self.total_col_headings
            for j, x in enumerate(data):
                if x[0] == x[1]:
                    self.data_first_cells.append(x[0])
                self.recycle_data.append("text": str(x[0]),"Index": str(x[1]),"range": x[2],"selectable": True,"viewclass": "CellRow","table": self)
            if not self.table_header.column_data:
                raise ValueError(f"Set value for column_data in class TableData")
            self.data_first_cells.append(self.table_header.column_data[0][0])
    def set_text_from_of(self, direction):
        if self.pagination:
            if direction == "forward":
                if (len(self._row_data_parts[self._rows_number])< self._to_value):
                    self._current_value = self._current_value + self.rows_num
                else:
                    self._current_value = self._current_value + len(self._row_data_parts[self._rows_number])
                self._to_value = self._to_value + len(self._row_data_parts[self._rows_number])
            if direction == "back":
                self._current_value = self._current_value - len(self._row_data_parts[self._rows_number])
                self._to_value = self._to_value - len(self._row_data_parts[self._rows_number])
            if direction == "increment":
                self._current_value = 1
                self._to_value = self.rows_num + self._current_value - 1
            self.pagination.ids.label_rows_per_page.text = f"self._current_value-self._to_value of len(self.row_data)"
    def select_all(self, state):
        for i, data in enumerate(self.recycle_data):
            opts = self.layout_manager.view_opts
            cell_row_obj = self.view_adapter.get_view(i, self.data[i], opts[i]["viewclass"])
            cell_row_obj.ids.check.state = state
            self.on_mouse_select(cell_row_obj)
            cell_row_obj.select_check(True if state == "down" else False)
    def close_pagination_menu(self, *args):
        self.pagination_menu_open = False
    def open_pagination_menu(self):
        if self.pagination_menu.items:
            self.pagination_menu_open = True
            self.pagination_menu.open()
    def set_number_displayed_lines(self, instance_menu_item):
        self.rows_num = int(instance_menu_item.text)
        self.set_row_data()
        self.set_text_from_of("increment")
    def set_next_row_data_parts(self, direction):
        if direction == "forward":
            self._rows_number += 1
            self.pagination.ids.button_back.disabled = False
        elif direction == "back":
            self._rows_number -= 1
            self.pagination.ids.button_forward.disabled = False
        self.set_row_data()
        self.set_text_from_of(direction)
        if self._to_value == len(self.row_data):
            self.pagination.ids.button_forward.disabled = True
        if self._current_value == 1:
            self.pagination.ids.button_back.disabled = True
    def _split_list_into_equal_parts(self, lst, parts):
        for i in range(0, len(lst), parts):
            yield lst[i : i + parts]
    def on_mouse_select(self, instance):
        if not self.pagination_menu_open:
            if self.ids.row_controller.selected_row != instance.index:
                self.ids.row_controller.selected_row = instance.index
                self.ids.row_controller.select_current(self)
    def on_rows_num(self, instance, value):
        if not self._to_value:
            self._to_value = value
        self._rows_number = 0
        self._row_data_parts = list(
            self._split_list_into_equal_parts(self.row_data, value)
        )
class TablePagination(ThemableBehavior, MDBoxLayout):
    table_data = ObjectProperty()
class MDDataTable(BaseDialog):
    column_data = ListProperty()
    row_data = ListProperty()
    sort = BooleanProperty(False)
    check = BooleanProperty(False)
    use_pagination = BooleanProperty(False)
    rows_num = NumericProperty(5)
    pagination_menu_pos = OptionProperty("center", options=["center", "auto"])
    pagination_menu_height = NumericProperty("140dp")
    background_color = ListProperty([0, 0, 0, 0])
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.register_event_type("on_row_press")
        self.register_event_type("on_check_press")
        self.header = TableHeader(column_data=self.column_data, sort=self.sort)
        self.table_data = TableData(
            self.header,
            row_data=self.row_data,
            check=self.check,
            rows_num=self.rows_num,
            _parent=self,
        )
        self.pagination = TablePagination(table_data=self.table_data)
        self.table_data.pagination = self.pagination
        self.header.table_data = self.table_data
        self.table_data.fbind("scroll_x", self._scroll_with_header)
        self.ids.container.add_widget(self.header)
        self.ids.container.add_widget(self.table_data)
        if self.use_pagination:
            self.ids.container.add_widget(self.pagination)
        Clock.schedule_once(self.create_pagination_menu, 0.5)
    def on_row_press(self, *args):
        """Called when a table row is clicked."""
    def on_check_press(self, *args):
        """Called when the check box in the table row is checked."""
    def _scroll_with_header(self, instance, value):
        self.header.scroll_x = value
    def create_pagination_menu(self, interval):
        menu_items = [
            "text": f"i"
            for i in range(
                self.rows_num, len(self.row_data) // 2, self.rows_num,
            )
        ]
        pagination_menu = MDDropdownMenu(
            caller=self.pagination.ids.drop_item,
            items=menu_items,
            use_icon_item=False,
            position=self.pagination_menu_pos,
            max_height=self.pagination_menu_height,
            callback=self.table_data.set_number_displayed_lines,
            width_mult=2,
        )
        pagination_menu.bind(on_dismiss=self.table_data.close_pagination_menu)
        self.table_data.pagination_menu = pagination_menu
from kivy.metrics import dp
class Screen_jbsidis(Screen):
    def __init__(self, **kwargs):
        super(Screen_jbsidis, self).__init__(**kwargs)
        ii="screen = Screen()"
        self.table = MDDataTable(
            pos_hint = 'center_x' : 0.5, 'center_y' : 0.5,
            size_hint = (0.9, 0.6),
            check = True,
            column_data  =[
                ("F_name", dp(30)),
                ("Name", dp(30)),
                ("Mail", dp(30)),
                ("Phone", dp(30)),
            ],
            row_data = [
                ("P1","P2","GAMIL","0658"),
                ("P3","P4","GAMIL","0658"),
            ]
        )
        self.add_widget(self.table)
        #return Screen_jbsidis

m="MainApp().run()"

展示其工作原理的视频:https://youtu.be/84wpXlCaTDM

图片,jbsidis:

【讨论】:

以上是关于从类中获取价值到另一个 Python的主要内容,如果未能解决你的问题,请参考以下文章

从类中获取可为空的 var

为啥从类中访问类变量需要“自我”。在 Python 中? [复制]

您可以从类中获取实例变量名称吗? [复制]

Javascript - 从数组中查找所有类,从类中获取并返回内部文本

log4j从类中隔离某个级别

如何从类中获取 id [重复]