当前位置: 首页>>代码示例>>Python>>正文


Python Dialogs.TextDisplay类代码示例

本文整理汇总了Python中Dialogs.TextDisplay的典型用法代码示例。如果您正苦于以下问题:Python TextDisplay类的具体用法?Python TextDisplay怎么用?Python TextDisplay使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。


在下文中一共展示了TextDisplay类的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: __init__

    def __init__(self, block):
        """
        Properties dialog constructor.
        
        Args:
            block: a block instance
        """
        self._hash = 0

        gtk.Dialog.__init__(
            self,
            title='Properties: %s' % block.get_name(),
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT),
        )
        self._block = block
        self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)

        vpaned = gtk.VPaned()
        self.vbox.pack_start(vpaned)

        # Notebook to hold param boxes
        notebook = gtk.Notebook()
        notebook.set_show_border(False)
        notebook.set_scrollable(True)  # scroll arrows for page tabs
        notebook.set_tab_pos(gtk.POS_TOP)
        vpaned.pack1(notebook, True)

        # Params boxes for block parameters
        self._params_boxes = list()
        for tab in block.get_param_tab_labels():
            label = gtk.Label()
            vbox = gtk.VBox()
            scroll_box = gtk.ScrolledWindow()
            scroll_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
            scroll_box.add_with_viewport(vbox)
            notebook.append_page(scroll_box, label)
            self._params_boxes.append((tab, label, vbox))

        # Docs for the block
        self._docs_text_display = TextDisplay()
        self._docs_box = gtk.ScrolledWindow()
        self._docs_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self._docs_box.add_with_viewport(self._docs_text_display)
        notebook.append_page(self._docs_box, gtk.Label("Documentation"))

        # Error Messages for the block
        self._error_messages_text_display = TextDisplay()
        self._error_box = gtk.ScrolledWindow()
        self._error_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self._error_box.add_with_viewport(self._error_messages_text_display)
        vpaned.pack2(self._error_box)
        vpaned.set_position(int(0.65 * MIN_DIALOG_HEIGHT))

        # Connect events
        self.connect('key-press-event', self._handle_key_press)
        self.connect('show', self._update_gui)
        self.show_all()  # show all (performs initial gui update)
开发者ID:Bugzilla69,项目名称:gnuradio,代码行数:57,代码来源:PropsDialog.py

示例2: __init__

 def __init__(self, block):
     """
     Properties dialog contructor.
     
     Args:
         block: a block instance
     """
     self._hash = 0
     LABEL_SPACING = 7
     gtk.Dialog.__init__(self,
         title='Properties: %s'%block.get_name(),
         buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT),
     )
     self._block = block
     self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
     vbox = gtk.VBox()
     #Create the scrolled window to hold all the parameters
     scrolled_window = gtk.ScrolledWindow()
     scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     scrolled_window.add_with_viewport(vbox)
     self.vbox.pack_start(scrolled_window, True)
     #Params box for block parameters
     self._params_box = gtk.VBox()
     self._params_box.pack_start(get_title_label('Parameters'), False)
     self._input_object_params = list()
     #Error Messages for the block
     self._error_box = gtk.VBox()
     self._error_messages_text_display = TextDisplay()
     self._error_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
     self._error_box.pack_start(get_title_label('Error Messages'), False)
     self._error_box.pack_start(self._error_messages_text_display, False)
     #Docs for the block
     self._docs_box = err_box = gtk.VBox()
     self._docs_text_display = TextDisplay()
     self._docs_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
     self._docs_box.pack_start(get_title_label('Documentation'), False)
     self._docs_box.pack_start(self._docs_text_display, False)
     #Add the boxes
     vbox.pack_start(self._params_box, False)
     vbox.pack_start(self._error_box, False)
     vbox.pack_start(self._docs_box, False)
     #connect events
     self.connect('key-press-event', self._handle_key_press)
     self.connect('show', self._update_gui)
     #show all (performs initial gui update)
     self.show_all()
开发者ID:232675,项目名称:gnuradio,代码行数:46,代码来源:PropsDialog.py

示例3: __init__

	def __init__(self, block):
		"""
		SignalBlockParamsDialog contructor.
		@param block the signal block
		"""
		gtk.Dialog.__init__(self,
			title='Properties: %s'%block.get_name(),
			buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE),
		)
		self.block = block
		self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
		vbox = gtk.VBox()
		#Add the title label
		vbox.pack_start(get_title_label('Parameters'), False)
		#Create the scrolled window to hold all the parameters
		scrolled_window = gtk.ScrolledWindow()
		scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		scrolled_window.add_with_viewport(vbox)
		self.vbox.pack_start(scrolled_window, True)
		#Error Messages for the block
		self._error_box = gtk.VBox()
		self._error_messages_text_display = TextDisplay()
		self._error_box.pack_start(gtk.Label(), False, False, 7) #spacing
		self._error_box.pack_start(get_title_label('Error Messages'), False)
		self._error_box.pack_start(self._error_messages_text_display, False)
		#Docs for the block
		self._docs_box = err_box = gtk.VBox()
		self._docs_text_display = TextDisplay()
		self._docs_box.pack_start(gtk.Label(), False, False, 7) #spacing
		self._docs_box.pack_start(get_title_label('Documentation'), False)
		self._docs_box.pack_start(self._docs_text_display, False)
		#Add all the parameters
		for param in self.block.get_params():
			vbox.pack_start(param.get_input_object(self._handle_changed), False)
		#Add the error and docs box
		vbox.pack_start(self._error_box, False)
		vbox.pack_start(self._docs_box, False)
		#connect and show
		self.connect('key_press_event', self._handle_key_press)
		self.show_all()
		#initial update
		for param in self.block.get_params(): param.update()
		self._update()
开发者ID:GREO,项目名称:GNU-Radio,代码行数:43,代码来源:ParamsDialog.py

示例4: __init__

 def __init__(self, platform, action_handler_callback):
     """
     MainWindow contructor
     Setup the menu, toolbar, flowgraph editor notebook, block selection window...
     """
     self._platform = platform
     gen_opts = platform.get_block('options').get_param('generate_options')
     generate_mode_default = gen_opts.get_value()
     generate_modes = [
         (o.get_key(), o.get_name(), o.get_key() == generate_mode_default)
         for o in gen_opts.get_options()]
     # load preferences
     Preferences.load(platform)
     #setup window
     gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
     vbox = gtk.VBox()
     self.hpaned = gtk.HPaned()
     self.add(vbox)
     #create the menu bar and toolbar
     self.add_accel_group(Actions.get_accel_group())
     self.menu_bar = Bars.MenuBar(generate_modes, action_handler_callback)
     vbox.pack_start(self.menu_bar, False)
     self.tool_bar = Bars.Toolbar(generate_modes, action_handler_callback )
     vbox.pack_start(self.tool_bar, False)
     vbox.pack_start(self.hpaned)
     #create the notebook
     self.notebook = gtk.Notebook()
     self.page_to_be_closed = None
     self.current_page = None
     self.notebook.set_show_border(False)
     self.notebook.set_scrollable(True) #scroll arrows for page tabs
     self.notebook.connect('switch-page', self._handle_page_change)
     #setup containers
     self.flow_graph_vpaned = gtk.VPaned()
     #flow_graph_box.pack_start(self.scrolled_window)
     self.flow_graph_vpaned.pack1(self.notebook)
     self.hpaned.pack1(self.flow_graph_vpaned)
     self.btwin = BlockTreeWindow(platform, self.get_flow_graph);
     self.hpaned.pack2(self.btwin, False) #dont allow resize
     #create the reports window
     self.text_display = TextDisplay()
     #house the reports in a scrolled window
     self.reports_scrolled_window = gtk.ScrolledWindow()
     self.reports_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     self.reports_scrolled_window.add(self.text_display)
     self.reports_scrolled_window.set_size_request(-1, DEFAULT_REPORTS_WINDOW_WIDTH)
     self.flow_graph_vpaned.pack2(self.reports_scrolled_window, False) #dont allow resize
     #load preferences and show the main window
     self.resize(*Preferences.main_window_size())
     self.flow_graph_vpaned.set_position(Preferences.reports_window_position())
     self.hpaned.set_position(Preferences.blocks_window_position())
     self.show_all()
     self.reports_scrolled_window.hide()
     self.btwin.hide()
开发者ID:Sophrinix,项目名称:gnuradio,代码行数:54,代码来源:MainWindow.py

示例5: PropsDialog

class PropsDialog(gtk.Dialog):
    """
    A dialog to set block parameters, view errors, and view documentation.
    """

    def __init__(self, block):
        """
        Properties dialog contructor.
        
        Args:
            block: a block instance
        """
        self._hash = 0
        LABEL_SPACING = 7
        gtk.Dialog.__init__(self,
            title='Properties: %s'%block.get_name(),
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT),
        )
        self._block = block
        self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
        vbox = gtk.VBox()
        #Create the scrolled window to hold all the parameters
        scrolled_window = gtk.ScrolledWindow()
        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        scrolled_window.add_with_viewport(vbox)
        self.vbox.pack_start(scrolled_window, True)
        #Params box for block parameters
        self._params_box = gtk.VBox()
        self._params_box.pack_start(get_title_label('Parameters'), False)
        self._input_object_params = list()
        #Error Messages for the block
        self._error_box = gtk.VBox()
        self._error_messages_text_display = TextDisplay()
        self._error_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
        self._error_box.pack_start(get_title_label('Error Messages'), False)
        self._error_box.pack_start(self._error_messages_text_display, False)
        #Docs for the block
        self._docs_box = err_box = gtk.VBox()
        self._docs_text_display = TextDisplay()
        self._docs_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
        self._docs_box.pack_start(get_title_label('Documentation'), False)
        self._docs_box.pack_start(self._docs_text_display, False)
        #Add the boxes
        vbox.pack_start(self._params_box, False)
        vbox.pack_start(self._error_box, False)
        vbox.pack_start(self._docs_box, False)
        #connect events
        self.connect('key-press-event', self._handle_key_press)
        self.connect('show', self._update_gui)
        #show all (performs initial gui update)
        self.show_all()

    def _params_changed(self):
        """
        Have the params in this dialog changed?
        Ex: Added, removed, type change, hide change...
        To the props dialog, the hide setting of 'none' and 'part' are identical.
        Therfore, the props dialog only cares if the hide setting is/not 'all'.
        Make a hash that uniquely represents the params' state.
        
        Returns:
            true if changed
        """
        old_hash = self._hash
        #create a tuple of things from each param that affects the params box
        self._hash = hash(tuple([(
            hash(param), param.get_type(), param.get_hide() == 'all',
        ) for param in self._block.get_params()]))
        return self._hash != old_hash

    def _handle_changed(self, *args):
        """
        A change occured within a param:
        Rewrite/validate the block and update the gui.
        """
        #update for the block
        self._block.rewrite()
        self._block.validate()
        self._update_gui()

    def _update_gui(self, *args):
        """
        Repopulate the parameters box (if changed).
        Update all the input parameters.
        Update the error messages box.
        Hide the box if there are no errors.
        Update the documentation block.
        Hide the box if there are no docs.
        """
        #update the params box
        if self._params_changed():
            #hide params box before changing
            self._params_box.hide_all()
            #empty the params box
            for io_param in list(self._input_object_params):
                self._params_box.remove(io_param)
                self._input_object_params.remove(io_param)
                io_param.destroy()
            #repopulate the params box
            for param in self._block.get_params():
#.........这里部分代码省略.........
开发者ID:232675,项目名称:gnuradio,代码行数:101,代码来源:PropsDialog.py

示例6: MainWindow

class MainWindow(gtk.Window):
    """The topmost window with menus, the tool bar, and other major windows."""

    def __init__(self, platform):
        """
        MainWindow contructor
        Setup the menu, toolbar, flowgraph editor notebook, block selection window...
        """
        self._platform = platform
        # setup window
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
        vbox = gtk.VBox()
        self.hpaned = gtk.HPaned()
        self.add(vbox)
        # create the menu bar and toolbar
        self.add_accel_group(Actions.get_accel_group())
        vbox.pack_start(Bars.MenuBar(), False)
        vbox.pack_start(Bars.Toolbar(), False)
        vbox.pack_start(self.hpaned)
        # create the notebook
        self.notebook = gtk.Notebook()
        self.page_to_be_closed = None
        self.current_page = None
        self.notebook.set_show_border(False)
        self.notebook.set_scrollable(True)  # scroll arrows for page tabs
        self.notebook.connect("switch-page", self._handle_page_change)
        # setup containers
        self.flow_graph_vpaned = gtk.VPaned()
        # flow_graph_box.pack_start(self.scrolled_window)
        self.flow_graph_vpaned.pack1(self.notebook)
        self.hpaned.pack1(self.flow_graph_vpaned)
        self.btwin = BlockTreeWindow(platform, self.get_flow_graph)
        self.hpaned.pack2(self.btwin, False)  # dont allow resize
        # create the reports window
        self.text_display = TextDisplay()
        # house the reports in a scrolled window
        self.reports_scrolled_window = gtk.ScrolledWindow()
        self.reports_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.reports_scrolled_window.add(self.text_display)
        self.reports_scrolled_window.set_size_request(-1, DEFAULT_REPORTS_WINDOW_WIDTH)
        self.flow_graph_vpaned.pack2(self.reports_scrolled_window, False)  # dont allow resize
        # load preferences and show the main window
        Preferences.load(platform)
        self.resize(*Preferences.main_window_size())
        self.flow_graph_vpaned.set_position(Preferences.reports_window_position())
        self.hpaned.set_position(Preferences.blocks_window_position())
        self.show_all()
        self.reports_scrolled_window.hide()
        self.btwin.hide()

    ############################################################
    # Event Handlers
    ############################################################

    def _quit(self, window, event):
        """
        Handle the delete event from the main window.
        Generated by pressing X to close, alt+f4, or right click+close.
        This method in turns calls the state handler to quit.

        Returns:
            true
        """
        Actions.APPLICATION_QUIT()
        return True

    def _handle_page_change(self, notebook, page, page_num):
        """
        Handle a page change. When the user clicks on a new tab,
        reload the flow graph to update the vars window and
        call handle states (select nothing) to update the buttons.

        Args:
            notebook: the notebook
            page: new page
            page_num: new page number
        """
        self.current_page = self.notebook.get_nth_page(page_num)
        Messages.send_page_switch(self.current_page.get_file_path())
        Actions.PAGE_CHANGE()

    ############################################################
    # Report Window
    ############################################################

    def add_report_line(self, line):
        """
        Place line at the end of the text buffer, then scroll its window all the way down.

        Args:
            line: the new text
        """
        self.text_display.insert(line)

    ############################################################
    # Pages: create and close
    ############################################################

    def new_page(self, file_path="", show=False):
        """
#.........这里部分代码省略.........
开发者ID:birnie64,项目名称:gnuradio,代码行数:101,代码来源:MainWindow.py

示例7: PropsDialog

class PropsDialog(gtk.Dialog):
    """
    A dialog to set block parameters, view errors, and view documentation.
    """

    def __init__(self, block):
        """
        Properties dialog constructor.

        Args:
            block: a block instance
        """
        self._hash = 0

        gtk.Dialog.__init__(
            self,
            title='Properties: %s' % block.get_name(),
            buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
                     gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                     gtk.STOCK_APPLY, gtk.RESPONSE_APPLY)
        )
        self.set_response_sensitive(gtk.RESPONSE_APPLY, False)
        self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
        self._block = block

        vpaned = gtk.VPaned()
        self.vbox.pack_start(vpaned)

        # Notebook to hold param boxes
        notebook = gtk.Notebook()
        notebook.set_show_border(False)
        notebook.set_scrollable(True)  # scroll arrows for page tabs
        notebook.set_tab_pos(gtk.POS_TOP)
        vpaned.pack1(notebook, True)

        # Params boxes for block parameters
        self._params_boxes = list()
        for tab in block.get_param_tab_labels():
            label = gtk.Label()
            vbox = gtk.VBox()
            scroll_box = gtk.ScrolledWindow()
            scroll_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
            scroll_box.add_with_viewport(vbox)
            notebook.append_page(scroll_box, label)
            self._params_boxes.append((tab, label, vbox))

        # Docs for the block
        self._docs_text_display = TextDisplay()
        self._docs_box = gtk.ScrolledWindow()
        self._docs_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self._docs_box.add_with_viewport(self._docs_text_display)
        notebook.append_page(self._docs_box, gtk.Label("Documentation"))

        # Error Messages for the block
        self._error_messages_text_display = TextDisplay()
        self._error_box = gtk.ScrolledWindow()
        self._error_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self._error_box.add_with_viewport(self._error_messages_text_display)
        vpaned.pack2(self._error_box)
        vpaned.set_position(int(0.65 * MIN_DIALOG_HEIGHT))

        # Connect events
        self.connect('key-press-event', self._handle_key_press)
        self.connect('show', self._update_gui)
        self.connect('response', self._handle_response)
        self.show_all()  # show all (performs initial gui update)

    def _params_changed(self):
        """
        Have the params in this dialog changed?
        Ex: Added, removed, type change, hide change...
        To the props dialog, the hide setting of 'none' and 'part' are identical.
        Therefore, the props dialog only cares if the hide setting is/not 'all'.
        Make a hash that uniquely represents the params' state.

        Returns:
            true if changed
        """
        old_hash = self._hash
        #create a tuple of things from each param that affects the params box
        self._hash = hash(tuple([(
            hash(param), param.get_type(), param.get_hide() == 'all',
        ) for param in self._block.get_params()]))
        return self._hash != old_hash

    def _handle_changed(self, *args):
        """
        A change occurred within a param:
        Rewrite/validate the block and update the gui.
        """
        #update for the block
        self._block.rewrite()
        self._block.validate()
        self._update_gui()
        self._activate_apply()

    def _activate_apply(self):
        self.set_response_sensitive(gtk.RESPONSE_APPLY, True)

    def _update_gui(self, *args):
#.........这里部分代码省略.........
开发者ID:Cyan27,项目名称:gnuradio,代码行数:101,代码来源:PropsDialog.py

示例8: ParamsDialog

class ParamsDialog(gtk.Dialog):
	"""A dialog box to set block parameters."""

	def __init__(self, block):
		"""
		SignalBlockParamsDialog contructor.
		@param block the signal block
		"""
		gtk.Dialog.__init__(self,
			title='Properties: %s'%block.get_name(),
			buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE),
		)
		self.block = block
		self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
		vbox = gtk.VBox()
		#Add the title label
		vbox.pack_start(get_title_label('Parameters'), False)
		#Create the scrolled window to hold all the parameters
		scrolled_window = gtk.ScrolledWindow()
		scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		scrolled_window.add_with_viewport(vbox)
		self.vbox.pack_start(scrolled_window, True)
		#Error Messages for the block
		self._error_box = gtk.VBox()
		self._error_messages_text_display = TextDisplay()
		self._error_box.pack_start(gtk.Label(), False, False, 7) #spacing
		self._error_box.pack_start(get_title_label('Error Messages'), False)
		self._error_box.pack_start(self._error_messages_text_display, False)
		#Docs for the block
		self._docs_box = err_box = gtk.VBox()
		self._docs_text_display = TextDisplay()
		self._docs_box.pack_start(gtk.Label(), False, False, 7) #spacing
		self._docs_box.pack_start(get_title_label('Documentation'), False)
		self._docs_box.pack_start(self._docs_text_display, False)
		#Add all the parameters
		for param in self.block.get_params():
			vbox.pack_start(param.get_input_object(self._handle_changed), False)
		#Add the error and docs box
		vbox.pack_start(self._error_box, False)
		vbox.pack_start(self._docs_box, False)
		#connect and show
		self.connect('key_press_event', self._handle_key_press)
		self.show_all()
		#initial update
		for param in self.block.get_params(): param.update()
		self._update()

	def _update(self):
		"""
		Update the error messages box.
		Hide the box if there are no errors.
		Update the documentation block.
		Hide the box if there are no docs.
		"""
		self.block.validate()
		#update the errors box
		if self.block.is_valid(): self._error_box.hide()
		else: self._error_box.show()
		messages = '\n\n'.join(self.block.get_error_messages())
		self._error_messages_text_display.set_text(messages)
		#update the docs box
		if self.block.get_doc(): self._docs_box.show()
		else: self._docs_box.hide()
		self._docs_text_display.set_text(self.block.get_doc())

	def _handle_key_press(self, widget, event):
		"""
		Handle key presses from the keyboard.
		Call the ok response when enter is pressed.
		@return false to forward the keypress
		"""
		keyname = gtk.gdk.keyval_name(event.keyval)
		if keyname == 'Return': self.response(gtk.RESPONSE_OK)
		return False #forward the keypress

	def _handle_changed(self, param):
		"""
		A change occured, update any dependent parameters:
		The enum inside the variable type may have changed and,
		the variable param will need an external update.
		@param param the graphical parameter that initiated the callback
		"""
		#update dependent params
		if param.is_enum():
			for other_param in param.get_parent().get_params():
				if param.get_key() is not other_param.get_key() and (
				param.get_key() in other_param._type or \
				param.get_key() in other_param._hide): other_param.update()
		#update
		self._update()
		return True

	def run(self):
		"""
		Call run().
		@return true if a change occured.
		"""
		original_data = list()
		for param in self.block.get_params():
			original_data.append(param.get_value())
#.........这里部分代码省略.........
开发者ID:GREO,项目名称:GNU-Radio,代码行数:101,代码来源:ParamsDialog.py


注:本文中的Dialogs.TextDisplay类示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。