मैंने अभी ipywidgets का उपयोग करना शुरू किया है और मैं रस्सियों को खोजने की कोशिश कर रहा हूं, इसलिए यदि इस प्रश्न का उत्तर पहले दिया गया है या दस्तावेज़ीकरण इसे किसी तरह से कवर करता है, तो कृपया मुझे उस अनुभाग पर इंगित करें। अनिवार्य रूप से, यहाँ UI का एक लघु संस्करण है जिसे मैं विकसित करने का प्रयास कर रहा हूँ।

जिस प्रश्न ने मुझे उलझन में डाल दिया है, एक बार जब मैं नीचे दिखाए गए यूआई का निर्माण करता हूं, और उपयोगकर्ता अपना इनपुट प्रदान करता है, तो मैं इनपुट को कैसे उतारूं? मैं प्रत्येक चर के लिए मूल्य एकत्र करने और अपने तर्क को ट्रिगर करने की उम्मीद कर रहा हूं, लेकिन दस्तावेज़ीकरण में केवल एक चीज जो मैं देखता हूं वह बातचीत या इंटरैक्टिव का उपयोग करने के बारे में बात करता है।

हालांकि मुझे वास्तव में यकीन नहीं है कि उन्हें एकाधिक विजेट्स के साथ कैसे उपयोग किया जाए, मेरे सामने आए सभी उदाहरण एक ही विजेट के साथ उनका उपयोग करने की ओर इशारा करते हैं। अगर कोई मुझे एक अच्छे संसाधन की ओर इशारा कर सकता है या एक नमूना प्रदान कर सकता है, तो यह मददगार होगा।

उस क्लासिफायरियर के साथ, मैं यहाँ क्या करने की कोशिश कर रहा हूँ:

import ipywidgets as widgets
style = {'description_width': 'initial'}

def input_tab(tab_list, tab_names_list):
    if len(tab_list) == len(tab_names_list):
        this_tab = Tab()
        this_tab.children = tab_list
        [this_tab.set_title(i, title) for i, title in enumerate(tab_names_list)]
        return this_tab
    else:
        raise ValueError('\n Input lists should be of the same size')

def get_input_panel_num():
    input_1 = widgets.Text(value='3000', description='Input-1', style=style)
    input_2 = widgets.Dropdown(options=['yes', 'no'], description='Select one', value='yes', disabled=False, style=style)
    input_3 = widgets.IntSlider(value=0, min=0, max=1, step=1, description='Input-3', orientation='horizontal', readout=True, 
                               style=style)
    input_list_num = [input_1, input_2, input_3]
    return input_list_num

def get_input_panel_char():
    input_a = widgets.Text(value='3000', description='Input-1', style=style)
    input_b = widgets.Dropdown(options=['yes', 'no'], description='Select one', value='yes', disabled=False, style=style)
    input_c = widgets.IntSlider(value=0, min=0, max=1, step=1, description='Input-3', orientation='horizontal', readout=True, 
                               style=style)
    input_list_char = [input_a, input_b, input_c]
    return input_list_char

def create_master_tab():
    tab_names = ["tab-1", "tab-2"]
    panel_num = VBox(get_input_panel_num())
    panel_char = VBox(get_input_panel_char())
    final = input_tab(tab_list=[panel_num, panel_char], tab_names_list=tab_names)
    return final

demo = create_master_tab()
demo 

**************** अद्यतन प्रश्न *************** @ ac24 : मैं टिप्पणियों में सभी कोड पोस्ट करने में असमर्थ था, इसलिए आपकी सलाह को शामिल करने के बाद मेरा अद्यतन कोड यहां दिया गया है। यह बड़े हिस्से के लिए अपेक्षित रूप से चलता है, लेकिन शीर्षकों को स्वीकार करने से इंकार कर देता है, जिसके बारे में मैं भ्रमित हूं। मैं टैब पर शीर्षक सेट करने में सक्षम था जब वे ठीक उसी दृष्टिकोण का उपयोग कर कार्य कर रहे थे, इसलिए मुझे यकीन नहीं है कि वास्तव में क्या बदल गया है:

import ipywidgets as widgets 
from ipywidgets import HBox
from ipywidgets import Tab 


# Definition of style
style = {'description_width': 'initial'}


class TabHolder(Tab):
    def __init__(self, tab_objects, tab_names):
        """
        Initialization of TabHolder object class

        :param list tab_objects: collection of display objects to be captured in the tabs
        :param list tab_names: names to assign to the tabs
        :return: tab widget containing all the tabs
        :rtype: Tab
        """

        if len(tab_names) != len(tab_objects):
            raise ValueError("\n Failed in TabHolder creation, because of lengths of inputs don't match")
        else:
            self.tab = Tab()
            self.tab_names = tab_names
            self.tab_objects = tab_objects
            self.inputs = []
            for i in tab_objects:
                self.inputs.append(i)
            super().__init__(children=self.inputs)
            [self.tab.set_title(i, title) for i, title in enumerate(self.tab_names)]  # Why titles not being set?


class InputPanelChar(HBox):

    def __init__(self):
        self.input_a = widgets.Text(value='3000', description='Input-1', style=style)
        self.input_b = widgets.Dropdown(options=['yes', 'no'], description='Select one', value='yes', disabled=False,
                                        style=style)
        self.input_c = widgets.IntSlider(value=0, min=0, max=1, step=1, description='Input-3', orientation='horizontal',
                                         readout=True, style=style)
        self.input_list_char = [self.input_a, self.input_b, self.input_c]
        super().__init__(children= self.input_list_char)

    def get_interact_value(self):
        return {
            w.description: w.get_interact_value()
            for w in self.input_list_char
        }


class InputPanelNum(HBox):

    def __init__(self):
        self.input_1 = widgets.Text(value='3000', description='Input-1', style=style)
        self.input_2 = widgets.Dropdown(options=['yes', 'no'], description='Select one', value='yes', disabled=False,
                                        style=style)
        self.input_3 = widgets.IntSlider(value=0, min=0, max=1, step=1, description='Input-3', orientation='horizontal',
                                         readout=True, style=style)
        self.input_list_num = [self.input_1, self.input_2, self.input_3]
        super().__init__(children= self.input_list_num)

    def get_interact_value(self):
        return {
            w.description: w.get_interact_value()
            for w in self.input_list_num
        }
0
UGuntupalli 15 अप्रैल 2020, 03:01

1 उत्तर

सबसे बढ़िया उत्तर

ठीक उसी मुद्दे के माध्यम से होने के बाद, मेरा समाधान विजेट समूहों के वर्गों को विकसित करना था जो एक साथ समझ में आते हैं।

यदि आप अपने विभिन्न कार्यों को कक्षाओं में परिवर्तित करते हैं, तो आप विभिन्न विजेट मान निकाल सकते हैं। मैंने आपके input_panel_char फ़ंक्शन को HBox के उपवर्ग में रूपांतरित कर दिया है।

मैंने माना है कि आप विजेट मानों को कुंजी के रूप में विजेट विवरण के साथ एक शब्दकोश के रूप में प्राप्त करना चाहते हैं।

class InputPanelChar(widgets.HBox):

    def __init__(self):
        self.input_a = widgets.Text(value='3000', description='Input-1', style=style)
        self.input_b = widgets.Dropdown(options=['yes', 'no'], description='Select one', value='yes', disabled=False, style=style)
        self.input_c = widgets.IntSlider(value=0, min=0, max=1, step=1, description='Input-3', orientation='horizontal', readout=True, 
                               style=style)
        self.input_list_char = [self.input_a, self.input_b, self.input_c]
        super().__init__(children= self.input_list_char)

    def get_interact_value(self):
        return {
            w.description: w.get_interact_value()
            for w in self.input_list_char
        }

enter image description here

*****अपडेट करें*****

अपना टैब होल्डर बनाते समय, आप Tab को उपवर्गित करते हैं और एक टैब इंस्टेंस बनाते हैं, जो भ्रम पैदा कर रहा है। आपको केवल उपवर्ग Tab करना है और फिर self एक Tab उदाहरण है, आपके उदाहरण में self.tabs बनाने की कोई आवश्यकता नहीं है। आशा है कि यह उदाहरण स्पष्ट है:


class TabHolder(Tab):
    def __init__(self, tab_objects, tab_names):

        if len(tab_names) != len(tab_objects):
            raise ValueError("\n Failed in TabHolder creation, because of lengths of inputs don't match")
        else:
            self.tab_names = list(tab_names)
            self.tab_objects = list(tab_objects)
            super().__init__(children=self.tab_objects)
            for i, title in enumerate(self.tab_names):
                self.set_title(i, title)
1
ac24 20 अप्रैल 2020, 07:36