Giter Club home page Giter Club logo

orange-widget-base's Introduction

Orange Widget Base

Orange Widget Base provides a base widget component for a interactive GUI based workflow. It is primarily used in the Orange data mining application.

Orange Widget Base requires Python 3.6 or newer.

Installing with pip

# Create a separate Python environment for Orange and its dependencies ...
python3 -m venv orangevenv
# ... and make it the active one
source orangevenv/bin/activate

# Clone the repository and move into it
git clone https://github.com/biolab/orange-widget-base.git
cd orange-widget-base

# Install Qt dependencies for the GUI
pip install PyQt5 PyQtWebEngineCore

# Finally install this in editable/development mode.
pip install -e .

Starting the GUI

Start a default workflow editor GUI with

python -m orangecanvas --config orangewidget.workflow.config.Config

orange-widget-base's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

orange-widget-base's Issues

Error message not clickable

Orange version

3.26.0.dev

Expected behavior

The user can see the entire error message. If the message is too long, one can click on the message and see it.

Actual behavior

The error message is not shown entirely for some widgets.

Steps to reproduce the behavior

File - Select Columns (remove all features from attributes) - Logistic Regression (or Naive Bayes).

Checkbox with specific state when disabled

We are often in situation when we disable checkbox because it is not applicable to some situation. The state of the checkbox remains the same, because it is synchronized with the setting.

One approach is to not use gui (as Aleš suggested). But gui isn't going away. We could have a check box method disableWithState(state), which would disable the checkbox and sets it to the given state (without synchronizing with the attribute). We would also override QCheckBox.setDisabled so that it would set the state when enabling the widget.

PDF export broken, no points shown

Orange version

master

Expected behavior

PDF export shows what is shown in widget.

Actual behavior

PDF export shows everything except points/selection/labels.

Steps to reproduce the behavior

File (Iris) -> Scatterplot

Press save, choose PDF from dropdown, save it, open it.

Additional info (worksheets, data, screenshots, ...)

Env:

  • macOS 10.15
  • PyQt5==5.15.1
  • pyqtgraph==0.11.0

Screenshot 2020-10-27 at 20 56 07
Screenshot 2020-10-27 at 20 56 12

[RFC] User-only settings

We discussed this at a meeting and postponed the idea, but I've thought about this a bit more...

There's a use case for saving a Setting locally, as opposed to in the workflow file.

This could be done not with QSettings, but the following way:

  • each workflow is assigned a randomly generated ID
  • each widget is assigned a sequential ID
  • a JSON file named <workflow-id>.json is created somewhere in the data directory (~/Library/Application Support/Orange on Mac), mapping widgets to their user-only setting values

Error caused by `_bind_messages` when widget class includes a DataFrame-type attribute

Orange version

orange-widget-base 4.23.0

Expected behavior

Users should be able to define the attributes they need in the widget class

Actual behavior

When a DataFrame attribute is defined within a widget class, clicking on the widget in Orange will result in pandas raising a ValueError, rendering the widget unusable.

Steps to reproduce the behavior
  1. git clone https://github.com/biolab/orange3-example-addon.git
  2. Add df = pandas.DataFrame() to MyWidget class in orangecontrib/example/widgets/mywidget.py
  3. Install it (pip install -e .)
  4. Open Orange and click this widget
Additional info (worksheets, data, screenshots, ...)
Error msg
CRITICAL:orangecanvas.scheme.widgetmanager: 
Traceback (most recent call last):
  File "venv/lib/python3.10/site-packages/orangecanvas/scheme/widgetmanager.py", line 243, in __add_widget_for_node
    w = self.create_widget_for_node(node)
  File "venv/lib/python3.10/site-packages/orangewidget/workflow/widgetsscheme.py", line 300, in create_widget_for_node
    widget = self.create_widget_instance(node)
  File "venv/lib/python3.10/site-packages/orangewidget/workflow/widgetsscheme.py", line 403, in create_widget_instance
    item.widget = widget = klass.__new__(
  File "venv/lib/python3.10/site-packages/orangewidget/widget.py", line 314, in __new__
    WidgetMessagesMixin.__init__(self)
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 345, in __init__
    super().__init__()
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 310, in __init__
    bound_group = group_class(self)
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 180, in __init__
    self._bind_messages()
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 198, in _bind_messages
    if group in widget_class.__dict__.values():
  File "venv/lib/python3.10/site-packages/pandas/core/generic.py", line 1577, in __nonzero__
    raise ValueError(
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
---------------------------- ValueError Exception -----------------------------
Traceback (most recent call last):
  File "venv/lib/python3.10/site-packages/orangecanvas/scheme/widgetmanager.py", line 404, in __process_init_queue
    self.ensure_created(node)
  File "venv/lib/python3.10/site-packages/orangecanvas/scheme/widgetmanager.py", line 350, in ensure_created
    self.__add_widget_for_node(node)
  File "venv/lib/python3.10/site-packages/orangecanvas/scheme/widgetmanager.py", line 243, in __add_widget_for_node
    w = self.create_widget_for_node(node)
  File "venv/lib/python3.10/site-packages/orangewidget/workflow/widgetsscheme.py", line 300, in create_widget_for_node
    widget = self.create_widget_instance(node)
  File "venv/lib/python3.10/site-packages/orangewidget/workflow/widgetsscheme.py", line 403, in create_widget_instance
    item.widget = widget = klass.__new__(
  File "venv/lib/python3.10/site-packages/orangewidget/widget.py", line 314, in __new__
    WidgetMessagesMixin.__init__(self)
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 345, in __init__
    super().__init__()
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 310, in __init__
    bound_group = group_class(self)
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 180, in __init__
    self._bind_messages()
  File "venv/lib/python3.10/site-packages/orangewidget/utils/messages.py", line 198, in _bind_messages
    if group in widget_class.__dict__.values():
  File "venv/lib/python3.10/site-packages/pandas/core/generic.py", line 1577, in __nonzero__
    raise ValueError(
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
-------------------------------------------------------------------------------

Check types of settings

As @ales-erjavec wrote in #15, settings can only be lists, tuples, dicts, ints, floats, strings, bytes and None. Violations cause problems that may be difficult to diagnose.

This cannot be checked in unittests or in widget's meta class. A frequently called function would need to have an assert statement for checking types.

Visual settings need to be documented

Orange version

3.34.0

Expected behavior

The documentation should contain explanations of the available visual settings for all widgets.

Actual behavior

There does not seem to be any documentation of the visual settings for the widgets – they are not always self-explanatory. E g, in the Line Plot widget there are settings for “Range” and “Selected range”. I thought these might adjust the boundaries for the Range in the Display settings, but apparently they represent the percentage of the grey scale value of the rendered Range. A pop-up would be fine.

Steps to reproduce the behavior

Go through the documentation pages at https://orangedatamining.com/widget-catalog/, notice the visual settings are not mentioned.
Open a widget and click the “Set visual settings” [a little redundant, eh?] button, hover over the settings, note no popups appear.

Additional info (worksheets, data, screenshots, ...)

gui.TabWidget renders poorly

Orange version

3.30.dev

Expected behavior

gui.TabWidget has no overlapping blue part and not redundant top space.

Actual behavior

gui.TabWidget has space on top (not sure this is related to the element, but I remember box=None parameter elsewhere). But a more important issue is the strange blue part that overlaps with the unselected tab.

Screen Shot 2021-07-02 at 14 20 36

Steps to reproduce the behavior

Place Network Analysis widget on the canvas.

Additional info (worksheets, data, screenshots, ...)

ListViewSearch: Does not filter on changed data

Orange version

orange-widget-base: 4.18.0.dev0+86a1dd8
Orange3: 3.32.0.dev0+2b857a3

Expected behavior

I enter a text in "Filter..." and the variables are filtered.

Actual behavior

Filtering does not work properly if the input data has changed.
After the filter text is deleted and re-entered it works.
When the data changes again, it does not work again.

Steps to reproduce the behavior
  • Load Iris Dataset
  • Connect Data to Widget with ListViewSearch (I tested with Unique and Group by)
  • Type "sepal" --> Only iris is filtered
  • remove filter text and type again "sepal" --> iris, petal length and petal width are filtered
  • remove connection between the widgets and connect again
  • Type "sepal" --> Only iris is filtered

The same behavior if the data is changed e.g. with Edit Domain.

Logical Regression is Not Working in Text Widget

Orange version

Version 3.25.0
Text mining widget version: 0.9.1
OS Windows 10 pro

Expected behavior

Should let me apply logical regression.

Actual behavior

I was practicing a workflow creation exercise in text mining widget exactly like a Youtube tutorial video: https://www.youtube.com/watch?v=zO_zwKZCULo&t=31s

My workflow: Corpus>Preprocess text>bag of words>logical regression
File selected in corpus is default: grimm-tales-selected.tab
But when I applied logical regression to bag words, it throws error code like this ( the error stays in loop).

`Traceback (most recent call last):

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\orangecanvas\scheme\widgetmanager.py", line 242, in __add_widget_for_node
w = self.create_widget_for_node(node)

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\orangewidget\workflow\widgetsscheme.py", line 296, in create_widget_for_node
widget = self.create_widget_instance(node)

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\orangewidget\workflow\widgetsscheme.py", line 396, in create_widget_instance
klass = name_lookup(desc.qualified_name)

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\orangecanvas\utils_init_.py", line 80, in name_lookup
module = import(module_name, fromlist=[class_name])

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\widgets\model\owlogisticregression.py", line 8, in
from Orange.widgets.utils.owlearnerwidget import OWBaseLearner

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\widgets\utils\owlearnerwidget.py", line 6, in
from Orange.modelling import Fitter, Learner, Model

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\modelling_init_.py", line 6, in
from .ada_boost import *

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\modelling\ada_boost.py", line 2, in
from Orange.ensembles import (

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\ensembles_init_.py", line 5, in
from .stack import *

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\ensembles\stack.py", line 92, in
class StackedClassificationLearner(StackedLearner, LearnerClassification):

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\ensembles\stack.py", line 100, in StackedClassificationLearner
def init(self, learners, aggregate=LogisticRegressionLearner(), k=5,

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\classification\logistic_regression.py", line 46, in init
self.params = vars()

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\base.py", line 505, in params
self._params = self._get_sklparams(value)

File "C:\Users\vippankumar\AppData\Local\Orange\lib\site-packages\Orange\base.py", line 512, in _get_sklparams
assert spec.args[0] == "self"

IndexError: list index out of range`

Steps to reproduce the behavior
Additional info (worksheets, data, screenshots, ...)

My workflow image:
Error_logical regression

ControlAreaVisible is not applied if save_position=False

Orange version

3.30.1

Expected behavior

If a widget was configured with save_position = False, I would have expected it to save and restore the ControlAreaVisible state anyway.

Actual behavior

The controlAreaVisible status saved in the workflow is not restored when the workflow is opened.

Steps to reproduce the behavior
  • Create a widget with save_position = False
  • Insert it into a workflow
  • hide the control area
  • save workflow
  • reload workflow
  • open the widget
  • the control area is not hidden
Additional info (worksheets, data, screenshots, ...)

I think it is because of these lines:

if self.save_position and not self.__was_restored:
# Restore saved geometry on (first) show
if self.__splitter is not None:
self.__setControlAreaVisible(self.controlAreaVisible)
if self.savedWidgetGeometry is not None:
self.__restoreWidgetGeometry(bytes(self.savedWidgetGeometry))

Not only the geometry but also the ControlArea visibility depends on save_position.

Widget geometry should be saved together with other Settings

Right now widget geometry saving is tied to resizeEvent, hideEvent, moveEvent and closeEvent in OWBaseWidget.

Instead, it should use a mechanic like the one implemented in #151. After that's merged:

  • widget geometry should be saved on settingsAboutTobePacked
  • sync_node_properties should also be called when a widget's window is unfocused (intrinsically calls settingsAboutToBePacked)

Make ComboBoxSearch available through gui.comboBox

Currently, utils.combobox.ComboBox can be accessed through gui.comboBox, which also takes care of value synchronization etc.
utils.combobox.ComboBoxSearch should also be available in the same way, preferably with the same gui.comboBox and specifying search=True or something similar.

Retain column width in QTableView

Orange version

3.36

Expected behavior

Remember column was resized in a data table and apply resizing on column width computation?

Actual behavior

I'd like to retain column width in data tables across Orange. For example, I open Data Table and resize one text column. Now, I change something upstream. The data table is updated and column resized to default. If I wish to interactively observe changes to my workflow, I have to keep resizing the column to the desired width.

Steps to reproduce the behavior

Corpus (deerwester) - Statistics - Data Table. Resize column in Data Table, recompute statistics.

Additional info (worksheets, data, screenshots, ...)

This might be a pain in the butt to do. Or not. I rely on experts (@ales-erjavec) to decide whether this is a doable solution.

Hide error message when it doesn't fit

Some widgets are too narrow to show error/warning/info messages.

If there is not enough space in the status line to show icons, status and message, it would be better to show just the triangle and not the message (instead of showing the first few words, possibly uninformative).

(Inspired by biolab/orange3#4170.)

Feature Request: Use Exact Number of Attributes Instead of Up To Number of Attributes

Orange version

3.26.0

Feature Request

In the Mosaic Display widget (and probably in others, as well), you can ask for informative comparisons, and the program will go through and rank all of the comparisons. You also have the option to limit how many attributes to look at. I haven't used it much, but it seems as though going all the way up to 4 (the max) will take a long time to find all of the useful comparisons.

What if there was an option where, instead of "up to" a certain number, you could include "exactly" a certain number. For instance, I could have it only give me comparisons of exactly three attributes. That way, I could start at one and look at all of those. Then I could jump to two, then look at those, etc.

DateTimeEditWCalendarTime: fix inconsistncies

In #153 is noticed:

After some further investigation I noticed: if one changes only the month or the year it does not reflect on the value, wheres changing the date or the time does. Besides, when changing the date, the popup closes, meanwhile changing anything the popup remains open. I can merge the PR, because it fixes a bug, but I disagree with the inconsistency.

I am opening this PR that we do not forget about this.

Override cursor handling in spinbox and autocommit is buggy ...

... at least in theory: I did not try to reproduce the bug, I just see it in code. We fall into the same trap as this guy: https://stackoverflow.com/questions/66185831/pyqt5-how-to-restore-the-default-cursor-after-multiple-overrides

Whenever we override an application-wide cursor, these go onto a stack. For example, if anything overrides the cursor while you are dragging in the spinbox, then after drag the overridden cursor will not be restored.

I do not see a safe use of override cursors. As a hack, restores could become something like the following, which guarantees that the default cursor will always be restored.

while QApplication.overrideCursor() is not None:
   QApplication.restoreOverrideCursor()

To use it, we would also need to be sure that QApplication.restoreOverrideCursor() does crash if the current stack is empty (because this code could clean someone else's cursor).

So I'd avoid override cursors completely. SpinBoxes could probably be rewritten to capture the mouse and then use .setCursor on themselves.

Opening a workflow results in many crashes

Orange version

3.32.0 / 3.31.0

Expected behavior

Old workflows can be opened on newer version.

Actual behavior
Stack Trace:
Traceback (most recent call last):
  File "/Users/ajda/orange/orange-widget-base/orangewidget/widget.py", line 1063, in showEvent
    self.__restoreWidgetGeometry(bytes(self.savedWidgetGeometry))
  File "/Users/ajda/orange/orange-widget-base/orangewidget/widget.py", line 956, in __restoreWidgetGeometry
    self.move(x, y)
TypeError: arguments did not match any overloaded call:
  move(self, QPoint): argument 1 has unexpected type 'float'
  move(self, int, int): argument 1 has unexpected type 'float'

Steps to reproduce the behavior

Open the below workflow (no data required) and click on any widget.

Additional info (worksheets, data, screenshots, ...)

Uploading untitled_naloga 2.ows.zip…

Widgets whose __init__ is interrupted with signal processing sometimes fail to obtain data

If a users connects widgets that somehow wait (either with processSignals or qWait) widget's functions for setting input signal values are not executed. This specific bug only shows if a user drags from the input widget and chooses a widget in the context menu.

A minimum example is attached. To reproduce the bug, drag from File and choose Waiter widget. The function set_test is not executed. If I remove wait from the init.

This stopped working with the new separation. Some widgets (2 from Biopharm and 1 from Spectroscopy) use code like this. They probably can be fixed, but should we take care of backward compatibly?

from orangewidget.widget import OWBaseWidget, Input
from orangewidget.utils.webview import wait

class MyWidget(OWBaseWidget):
    name = "Waiter"
    want_main_area = False

    class Inputs:
        test = Input("test", object)

    def __init__(self):
        super().__init__()
        try:
            wait(lambda: False, 1000)
        except TimeoutError:
            pass

    @Inputs.test
    def set_test(self, v):
        print("Setting input", v)


if __name__ == "__main__":
    from Orange.widgets.utils.widgetpreview import WidgetPreview
    WidgetPreview(MyWidget).run()

Changing values of disabled spins

orangewidgets.gui.SpinBoxMixin does not check whether the spin is enabled and thus allows the user to change values of disabled spins by clicking and dragging.

Indicate uncommitted changes at the widget and canvas levels

Hi! As always, during summer school we are getting some new ideas to improve Orange:)

What's your use case?
During summer school lectures, students followed some instructions in Orange and often we had to remind them to not forget to press Commit button after they made changes to widget's settings (most often in Preprocessing widget).

What's your proposed solution?
That would be nice to indicate that the settings of a widget were changed and the Commit button likely have to be pressed (when auto-commit is disabled). The way to indicate it might be to change a color of Commit button from gray to red or something like this. Additionally that would be cool to add a red badge on a widget icon at canvas when the changes of its settings were not applied.

Show Help in widget does not work (on macOS?)

Orange version

3.36.2, running under macOS 14.1.1

Expected behavior

If I click on the "?" (Show Help) icon on a widget, I expect a popup window with documentation for the object.

Actual behavior

Nothing happens.

Steps to reproduce the behavior

Add a widget to the canvas.
Double-click the widget to open it.
Click the "?" icon in the bottow left corner.
Nothing happens.

Additional info (worksheets, data, screenshots, ...)

Images in reports are too large

After merging #208, images in reports are too large.

To reproduce, try reporting a box plot.

I assume that WebKit treats all images as 72dpi. Perhaps adding zoom: 0.5; to css would fix it. Edit: yes, but only if the image was taken on high-dpi screen.

Warn if the settings in the workflow are from higher versions

If we open some newer workflow on old Orange, the results are undefined. It could work, it might crash, or it could load but not work properly (forgets some settings).

On loading settings we should confirm that the setting version of the available widget is higher or equal to the saved setting version. If not, we should warn the user, and (if possible) show what to update (core orange or a specific add-on).

What to do after the warning? I do not know. I suggest we still try to use the settings as they are. If it crashes, well, fine, there was a warning.

set_output_summary: Use summary when no description

@PrimozGodec wrote in biolab/orange3#4904

Note: self.info.set_output_summary(summary, summary) is used since in the cases with string summary and empty description, the description is not set automatically to same value than it is done for int summary. I suggest merging this PR as it is and unifying those behaviours in the widget base. I would be happy to submit the PR.

Insert widget: can't insert sensible widgets

Orange version

3.25.dev

Expected behavior

File - MDS. When clicking on the link, I can insert Distances between the two.

Actual behavior

I can't insert Distances for some reason.

Steps to reproduce the behavior

File - MDS. Try to insert Distances between the two with the Insert widget option.

[RFC] Widget multiprocessing

Today @ajdapretnar, @lanzagar, @PrimozGodec and I talked about making all Orange widgets run concurrently.

The goal is to never freeze the main canvas GUI thread/process. When a widget is doing something, its window can freeze, but other widgets and the canvas should still be interactable. The widget's NodeItem on canvas should display an indefinite loading animation.

Note: It's still great to multithread things within widget, this'll make the widget's window not freeze while the task is running.

@PrimozGodec noted that threads cannot be forcefully stopped, so they're not appropriate for this. With threads, the solution would have to check if it was signalled to stop every so often, which is not viable for large-scale concurrency.

A multi-process solution must be implemented. To a widget process, the outside world must be immutable. Communicating with the main process, it receives some input signal data and sends some output signal data.
The canvas end must wait for the widget's processing to finish without freezing up. So there should be a thread waiting for widgets to finish, and/or receiving outputs should be integrated into the Qt event loop?

Signal type specified as qualified name crashes the widget class

Describe the bug
I an on widget-base, canvas-core, orange, orange3-text master branches. I do not have orange3-network installed.

2021-04-09 08:49:15,566:WARNING:orangecanvas.registry.discovery: Error while importing 'orangecontrib.text.widgets.owcorpustonetwork'.
Traceback (most recent call last):
  File "/home/marko/dev/orange-widget-base/orangewidget/utils/signals.py", line 58, in can_summarize
    summarizer = summarize.dispatch(a_type)
  File "/usr/lib/python3.8/functools.py", line 828, in dispatch
    impl = dispatch_cache[cls]
  File "/usr/lib/python3.8/weakref.py", line 383, in __getitem__
    return self.data[ref(key)]
TypeError: cannot create weak reference to 'str' object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/marko/dev/orange-canvas-core/orangecanvas/registry/discovery.py", line 260, in iter_widget_descriptions
    module = asmodule(name)
  File "/home/marko/dev/orange-canvas-core/orangecanvas/registry/discovery.py", line 503, in asmodule
    return __import__(module, fromlist=[""])
  File "/home/marko/dev/orange3-text/orangecontrib/text/widgets/owcorpustonetwork.py", line 45, in <module>
    class OWCorpusToNetwork(OWWidget, ConcurrentWidgetMixin):
  File "/home/marko/dev/orange3-text/orangecontrib/text/widgets/owcorpustonetwork.py", line 62, in OWCorpusToNetwork
    class Outputs:
  File "/home/marko/dev/orange3-text/orangecontrib/text/widgets/owcorpustonetwork.py", line 63, in Outputs
    network = Output("Network", "orangecontrib.network.Network")
  File "/home/marko/dev/orange-widget-base/orangewidget/utils/signals.py", line 228, in __init__
    self.auto_summary = auto_summary and can_summarize(type, name)
  File "/home/marko/dev/orange-widget-base/orangewidget/utils/signals.py", line 60, in can_summarize
    warnings.warn(f"{a_type.__name__} cannot be summarized. {instr}",
AttributeError: 'str' object has no attribute '__name__'
A clear and concise description of what the bug is.

ARIMA Model Widget AttributeError: 'NoneType' object has no attribute 'control'

Orange version

Orange 3.32

Expected behavior

ARIMA Model shows output without error

Actual behavior

ARIMA Model Widget AttributeError: 'NoneType' object has no attribute 'control'

Steps to reproduce the behavior

When drag ARIMA Model to workflow canvas, or Click it on Widget window

Additional info (worksheets, data, screenshots, ...)

Error Code :
image

image

Q: widget: may be missing: 'classification tree'

Orange version
Expected behavior

I want to select the 'classification tree' widget when right clicking on the canvas.

Actual behavior

When 'creating'/selecting a new widget in the canvas: right click and 'searching' for "classification tree" ther is no such widget to select.

Steps to reproduce the behavior

Just do a right click on the canvas, enter first few characters like as 'class' and see that here is no selection possible which sounds like classification tree.

Additional info (worksheets, data, screenshots, ...)

I tried to follow the youtube tutorial "Getting started with Orange" and I am stuch in chapter06: time: 1:00 from 3:45.
Screen Shot 2019-12-19 at 4 49 45 PM

Blurry rendering of saved images (svg, pdf)

@Hrovatin reported in biolab/orange3#4384:

When exporting large heat maps in pdf and svg they are displayed blurry in some programs. This might be because of the image settings.
Top left: pdf in pdf viewer.
Top right: pdf in web browser (blurry).
Bottom left: svg in Inkscape (blurry).
Bottom right: svg in Inkscape with setting object properties (right click on heatmap) -> Image Rendering -> optimizeSpeed.
Screenshot from 2020-01-30 14-12-25
Also the colours in pdf and svg are a bit different. Could this be because of CMYK/RGB settings?

Explicit Orange3 import

I have an installation which only has orange-canvas an orange-base-widget and it complains about Orange3 not being installed

----------------------- DistributionNotFound Exception ------------------------
Traceback (most recent call last):
  File "/home/denolf/dev/orange-canvas-core/orangecanvas/application/canvasmain.py", line 1901, in browse_examples
    if self.examples_dialog() == QDialog.Accepted:
  File "/home/denolf/dev/orange-canvas-core/orangecanvas/application/canvasmain.py", line 1846, in examples_dialog
    tutors = examples.workflows(config.default)
  File "/home/denolf/dev/orange-canvas-core/orangecanvas/application/examples.py", line 46, in workflows
    for ep in examples_entry_points():
  File "/home/denolf/dev/orange-widget-base/orangewidget/workflow/config.py", line 81, in examples_entry_points
    dist=pkg_resources.get_distribution("Orange3"))
  File "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 471, in get_distribution
    dist = get_provider(dist)
  File "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 347, in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
  File "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 891, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 777, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'Orange3' distribution was not found and is required by the application
-------------------------------------------------------------------------------

So I guess the best way is to capture pkg_resources.DistributionNotFound and return an empty list here:

default_ep = pkg_resources.EntryPoint(
"Orange3", "Orange.canvas.workflows",
dist=pkg_resources.get_distribution("Orange3"))

Line Edits don't select entire text on double click

Orange version

3.30.dev

Expected behavior

Line Edit selects entire text on double click.

Actual behavior

Only a part of the text is selected.

Steps to reproduce the behavior

Double click a longer word in Line Edit (i.e. Edit Domain with heart disease data).

Additional info (worksheets, data, screenshots, ...)

edit

Add no shadow option?

For making screenshots on Mac it is extremely annoying to have the shadows around windows. It also makes the trim.py not work.

My current solution is to have two branches with small fixes for hiding shadows. This gets annoying when Orange/canvas/applications/canvasmain.py and Orange/widgets/widget.py change and one has to look for places to insert self.setWindowFlags(Qt.NoDropShadowWindowHint) at.

Could there be an option for hiding shadows in Preferences - Style? Just an idea.

ErrorReporting.handle_exception: causes segfault

Orange version
orange-canvas-core                0.1.32.dev0 
orange-widget-base                4.22.0.dev0+ebc5230
Orange3                           3.36.0.dev0+92d84ee

Qt related packages

AnyQt                             0.2.0
PyQt5                             5.15.9
PyQt5-Qt5                         5.15.2
PyQt5-sip                         12.11.0
pyqtgraph                         0.13.1
PyQtWebEngine                     5.15.6
PyQtWebEngine-Qt5                 5.15.2
qtconsole                         5.3.2
QtPy                              2.2.1
sphinxcontrib-qthelp              1.0.3

It also happens in our production environment which has

orange-canvas-core  0.1.31   
orange-widget-base  4.21.0   
Orange3             3.35.0

AnyQt               0.2.0    
PyQt5               5.14.1   
pyqtgraph           0.13.3   
qtconsole           5.4.3    
QtPy                2.3.1

OS: Ubuntu 20.04

Issue description

I have a particular case where an error in qt.Thread causes ErrorReporting.handle_exception to segfault.

If I replace this

def handle_exception(exc):
    return ErrorReporting.handle_exception(exc)

with this I don't get the segfault (i.e. the exception gets printed and the app keeps running)

def handle_exception(exc):
    traceback.print_exception(*exc)

This is the traceback I got from the core dump:

(gdb) py-bt-full
#20 <built-in method exec of ErrorReporting object at remote 0x7f65e4c4a280>
#25 Frame 0x5635469acc10, for file /home/denolf/dev/orange-widget-base/orangewidget/workflow/errorreporting.py, line 1555, in handle_exception (cls=<sip.wrappertype at remote 0x56353e1d5c30>, exc=(<type at remote 0x7f668e761bc0>, ValueError('Array passed to NMF (input W) is full of zeros.',), <traceback at remote 0x7f65e4570c00>), etype=<type at remote 0x7f668e761bc0>, evalue=(...), tb=<traceback at remote 0x7f65e4570c00>, exception='ValueError: Array passed to NMF (input W) is full of zeros.', stacktrace='Traceback (most recent call last):\n  File "/home/denolf/dev/darfix/src/darfix/gui/operationThread.py", line 32, in run\n    self.data = self.func(*self.args, **self.kwargs)\n  File "/home/denolf/dev/darfix/src/darfix/core/dataset.py", line 1632, in nica_nmf\n    return self.nmf(\n  File "/home/denolf/dev/darfix/src/darfix/core/dataset.py", line 1591, in nmf\n    W = model.fit_transform(X, W=W, H=H)\n  File "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/sklearn/decomposition/_nmf...(truncated)
#30 Frame 0x5635461db010, for file /users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/mock.py, line 1581, in patched (args=(<sip.wrappertype at remote 0x56353e1d5c30>, (<type at remote 0x7f668e761bc0>, ValueError('Array passed to NMF (input W) is full of zeros.',), <traceback at remote 0x7f65e4570c00>)), keywargs={}, newargs=(...), newkeywargs={...})
    spec_set, autospec, new_callable, kwargs
#37 Frame 0x7f65e3e5a520, for file /home/denolf/dev/orange-widget-base/orangewidget/workflow/errorreporting.py, line 279, in handle_exception (exc=(<type at remote 0x7f668e761bc0>, ValueError('Array passed to NMF (input W) is full of zeros.',), <traceback at remote 0x7f65e4570c00>))
    traceback.print_exception(*exc)
#58 <built-in method exec of CanvasApplication object at remote 0x7f6658162670>
#63 Frame 0x7f65e365eb20, for file /home/denolf/dev/orange-canvas-core/orangecanvas/application/application.py, line 170, in exec (self=<CanvasApplication(_CanvasApplication__fileOpenUrls=[], _CanvasApplication__in_exec=True) at remote 0x7f6658162670>)
    return super().exec()
#70 Frame 0x56353e1bb710, for file /home/denolf/dev/orange-canvas-core/orangecanvas/main.py, line 233, in run (self=<OMain(options=<Namespace(no_discovery=False, force_discovery=True, no_welcome=False, no_splash=False, log_level=40, stylesheet=None, config=None, qt=None, style=None, clear_widget_settings=False, clear_all=False) at remote 0x7f6656740be0>, arguments=['/users/denolf/projects/workflows/darfix/Augusts2023_BlindSourceIssue_Wzeroes_LIGHT.ows'], config=<Config at remote 0x7f66574a9d00>, stack=<ExitStack(_exit_callbacks=<collections.deque at remote 0x7f66567881c0>) at remote 0x7f6658161df0>, application=<CanvasApplication(_CanvasApplication__fileOpenUrls=[], _CanvasApplication__in_exec=True) at remote 0x7f6658162670>, _update_check=None, _send_stat=<SendUsageStatistics at remote 0x7f664d26cdc0>, _pull_notifs=<GetNotifFeed at remote 0x7f664d271790>, output=<TerminalTextDocument(_TerminalTextDocument__currentCharFormat=<QTextCharFormat at remote 0x7f6656784200>, _TerminalTextDocument__streams=[(<TextStream ...(truncated)
    rv = self.application.exec()
#77 Frame 0x7f66569e3740, for file /home/denolf/dev/orange3/Orange/canvas/__main__.py, line 356, in run (self=<OMain(options=<Namespace(no_discovery=False, force_discovery=True, no_welcome=False, no_splash=False, log_level=40, stylesheet=None, config=None, qt=None, style=None, clear_widget_settings=False, clear_all=False) at remote 0x7f6656740be0>, arguments=['/users/denolf/projects/workflows/darfix/Augusts2023_BlindSourceIssue_Wzeroes_LIGHT.ows'], config=<Config at remote 0x7f66574a9d00>, stack=<ExitStack(_exit_callbacks=<collections.deque at remote 0x7f66567881c0>) at remote 0x7f6658161df0>, application=<CanvasApplication(_CanvasApplication__fileOpenUrls=[], _CanvasApplication__in_exec=True) at remote 0x7f6658162670>, _update_check=None, _send_stat=<SendUsageStatistics at remote 0x7f664d26cdc0>, _pull_notifs=<GetNotifFeed at remote 0x7f664d271790>, output=<TerminalTextDocument(_TerminalTextDocument__currentCharFormat=<QTextCharFormat at remote 0x7f6656784200>, _TerminalTextDocument__streams=[(<TextStream at rem...(truncated)
    super().run(argv)
#82 Frame 0x7f665673c6c0, for file /home/denolf/dev/orange3/Orange/canvas/__main__.py, line 466, in main (argv=['/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '/users/denolf/projects/workflows/darfix/Augusts2023_BlindSourceIssue_Wzeroes_LIGHT.ows', '--force-discovery'])
    return OMain().run(argv)
#87 Frame 0x56353e18c8d0, for file /home/denolf/dev/ewoksorange/src/ewoksorange/canvas/main.py, line 366, in main (argv=['/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '/users/denolf/projects/workflows/darfix/Augusts2023_BlindSourceIssue_Wzeroes_LIGHT.ows', '--force-discovery'], parser=<ArgumentParser(description=None, argument_default=None, prefix_chars='-', conflict_handler='error', _registries={'action': {None: <type at remote 0x56353c918910>, 'store': <type at remote 0x56353c918910>, 'store_const': <type at remote 0x56353c918cc0>, 'store_true': <type at remote 0x56353c919070>, 'store_false': <type at remote 0x56353c919420>, 'append': <type at remote 0x56353c9197d0>, 'append_const': <type at remote 0x56353c919b80>, 'count': <type at remote 0x56353c919f30>, 'help': <type at remote 0x56353c91a2e0>, 'version': <type at remote 0x56353c91a690>, 'parsers': <type at remote 0x56353c91b2f0>, 'extend': <type at remote 0x56353c91b6a0>}, 'type': {None: <function at remote 0x7f668d863550>}}, _actions...(truncated)
#91 Frame 0x7f668d9d6440, for file /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas, line 8, in <module> ()
    sys.exit(main())

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007f668e232859 in __GI_abort () at abort.c:79
#2  0x00007f668ccc59bc in qErrnoWarning(char const*, ...) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#3  0x00007f668d4eb437 in  () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#4  0x00007f668d66088d in PyQtSlotProxy::unislot(void**) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#5  0x00007f668d661317 in PyQtSlotProxy::qt_metacall(QMetaObject::Call, int, void**) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#6  0x00007f668ceffda3 in QObject::event(QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#7  0x00007f668989c43c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
#8  0x00007f66898a2f20 in QApplication::notify(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
#9  0x00007f668a3920d6 in sipQApplication::notify(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtWidgets.abi3.so
#10 0x00007f668ced0808 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#11 0x00007f668ced3882 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#12 0x00007f668cf2cb33 in postEventSourceDispatch(_GSource*, int (*)(void*), void*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#13 0x00007f668a70717d in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#14 0x00007f668a707400 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#15 0x00007f668a7074a3 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#16 0x00007f668cf2c1cc in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#17 0x00007f668cecf21a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#18 0x00007f6689a84ff7 in QDialog::exec() () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
#19 0x00007f668a2b56b8 in meth_QDialog_exec () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtWidgets.abi3.so
#20 0x00007f668e4c2d97 in cfunction_call_varargs (func=<built-in method exec of ErrorReporting object at remote 0x7f65e4c4a280>, args=<optimized out>, kwargs=<optimized out>) at Objects/call.c:757
#21 0x00007f668e4c349b in _PyObject_MakeTpCall (callable=<built-in method exec of ErrorReporting object at remote 0x7f65e4c4a280>, args=<optimized out>, nargs=<optimized out>, keywords=0x0) at Objects/call.c:159
#22 0x00007f668e496533 in _PyObject_Vectorcall (kwnames=0x0, nargsf=<optimized out>, args=<optimized out>, callable=<built-in method exec of ErrorReporting object at remote 0x7f65e4c4a280>) at ./Include/cpython/abstract.h:125
#23 _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:115
#24 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff90730d90, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#25 0x00007f668e49deca in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3469
#26 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f665672abe0>, globals=globals@entry={'__name__': 'orangewidget.workflow.errorreporting', '__doc__': None, '__package__': 'orangewidget.workflow', '__loader__': <SourceFileLoader(name='orangewidget.workflow.errorreporting', path='/home/denolf/dev/orange-widget-base/orangewidget/workflow/errorreporting.py') at remote 0x7f6656722f70>, '__spec__': <ModuleSpec(name='orangewidget.workflow.errorreporting', loader=<...>, origin='/home/denolf/dev/orange-widget-base/orangewidget/workflow/errorreporting.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/home/denolf/dev/orange-widget-base/orangewidget/workflow/__pycache__/errorreporting.cpython-38.pyc', _initializing=False) at remote 0x7f665672b070>, '__file__': '/home/denolf/dev/orange-widget-base/orangewidget/workflow/errorreporting.py', '__cached__': '/home/denolf/dev/orange-widget-base/orangewidget/workflow/__pycache__/errorreporting.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy:...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=2, kwnames=0x0, kwargs=0x7f65e4506ca8, kwcount=0, kwstep=1, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name='handle_exception', qualname='ErrorReporting.handle_exception')
    at Python/ceval.c:4298
#27 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=func@entry=<function at remote 0x7f665672f3a0>, stack=<optimized out>, nargsf=nargsf@entry=2, kwnames=<optimized out>) at Objects/call.c:435
#28 0x00007f668e4c52d3 in PyVectorcall_Call (callable=<function at remote 0x7f665672f3a0>, tuple=<optimized out>, kwargs=<optimized out>) at Objects/call.c:199
#29 0x00007f668e4976bf in do_call_core
    (kwdict={}, callargs=(<sip.wrappertype at remote 0x56353e1d5c30>, (<type at remote 0x7f668e761bc0>, ValueError('Array passed to NMF (input W) is full of zeros.',), <traceback at remote 0x7f65e4570c00>)), func=<function at remote 0x7f665672f3a0>, tstate=0x56353b103bb0) at Python/ceval.c:5010
#30 _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3559
#31 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f6668441450>, globals=globals@entry={'__name__': 'unittest.mock', '__doc__': None, '__package__': 'unittest', '__loader__': <SourceFileLoader(name='unittest.mock', path='/users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/mock.py') at remote 0x7f66686886d0>, '__spec__': <ModuleSpec(name='unittest.mock', loader=<...>, origin='/users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/mock.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/__pycache__/mock.cpython-38.pyc', _initializing=False) at remote 0x7f6668688100>, '__file__': '/users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/mock.py', '__cached__': '/users/denolf/.pyenv/ubuntu_20_04/versions/3.8.5/lib/python3.8/unittest/__pycache__/mock.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=2, kwnames=0x0, kwargs=0x7f65e3e5a6a8, kwcount=0, kwstep=1, defs=0x0, defcount=0, kwdefs=0x0, closure=(<cell at remote 0x7f665672b6a0>, <cell at remote 0x7f665672b6d0>, <cell at remote 0x7f665672b700>), name='handle_exception', qualname='ErrorReporting.handle_exception') at Python/ceval.c:4298
#32 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:435
#33 0x00007f668e4c6c0a in _PyObject_Vectorcall (kwnames=0x0, nargsf=2, args=0x7f65e3e5a698, callable=<function at remote 0x7f665672f430>) at ./Include/cpython/abstract.h:127
#34 method_vectorcall (method=<optimized out>, args=0x7f65e3e5a6a0, nargsf=<optimized out>, kwnames=0x0) at Objects/classobject.c:60
#35 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#36 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff907313a0, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#37 0x00007f668e49deca in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3469
#38 0x00007f668e49517b in function_code_fastcall (co=<optimized out>, args=<optimized out>, nargs=1, globals=<optimized out>) at Objects/call.c:283
#39 0x00007f668e4c52d3 in PyVectorcall_Call (callable=<function at remote 0x7f665672f160>, tuple=<optimized out>, kwargs=<optimized out>) at Objects/call.c:199
#40 0x00007f668d6600b0 in PyQtSlot::call(_object*, _object*) const () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#41 0x00007f668d660558 in PyQtSlot::invoke(void**, _object*, void*, bool) const () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#42 0x00007f668d66084e in PyQtSlotProxy::unislot(void**) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#43 0x00007f668d661317 in PyQtSlotProxy::qt_metacall(QMetaObject::Call, int, void**) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtCore.abi3.so
#44 0x00007f668ceffda3 in QObject::event(QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#45 0x00007f668989c43c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
#46 0x00007f66898a2f20 in QApplication::notify(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
#47 0x00007f668a3920d6 in sipQApplication::notify(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtWidgets.abi3.so
#48 0x00007f668ced0808 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#49 0x00007f668ced3882 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#50 0x00007f668cf2cb33 in postEventSourceDispatch(_GSource*, int (*)(void*), void*) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#51 0x00007f668a70717d in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#52 0x00007f668a707400 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#53 0x00007f668a7074a3 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#54 0x00007f668cf2c1cc in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#55 0x00007f668cecf21a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#56 0x00007f668ced81d3 in QCoreApplication::exec() () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
#57 0x00007f668a1ddcc1 in meth_QApplication_exec () at /users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/lib/python3.8/site-packages/PyQt5/QtWidgets.abi3.so
#58 0x00007f668e4c2d97 in cfunction_call_varargs (func=<built-in method exec of CanvasApplication object at remote 0x7f6658162670>, args=<optimized out>, kwargs=<optimized out>) at Objects/call.c:757
#59 0x00007f668e4c349b in _PyObject_MakeTpCall (callable=<built-in method exec of CanvasApplication object at remote 0x7f6658162670>, args=<optimized out>, nargs=<optimized out>, keywords=0x0) at Objects/call.c:159
#60 0x00007f668e496533 in _PyObject_Vectorcall (kwnames=0x0, nargsf=<optimized out>, args=<optimized out>, callable=<built-in method exec of CanvasApplication object at remote 0x7f6658162670>)
    at ./Include/cpython/abstract.h:125
#61 _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:115
#62 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff90731d40, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#63 0x00007f668e49deca in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3469
#64 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f6656721920>, globals=globals@entry={'__name__': 'orangecanvas.application.application', '__doc__': '\n', '__package__': 'orangecanvas.application', '__loader__': <SourceFileLoader(name='orangecanvas.application.application', path='/home/denolf/dev/orange-canvas-core/orangecanvas/application/application.py') at remote 0x7f6656722190>, '__spec__': <ModuleSpec(name='orangecanvas.application.application', loader=<...>, origin='/home/denolf/dev/orange-canvas-core/orangecanvas/application/application.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/home/denolf/dev/orange-canvas-core/orangecanvas/application/__pycache__/application.cpython-38.pyc', _initializing=False) at remote 0x7f6656722100>, '__file__': '/home/denolf/dev/orange-canvas-core/orangecanvas/application/application.py', '__cached__': '/home/denolf/dev/orange-canvas-core/orangecanvas/application/__pycache__/application.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNotewort...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=1, kwnames=0x0, kwargs=0x56353e1bb8d8, kwcount=0, kwstep=1, defs=0x0, defcount=0, kwdefs=0x0, closure=(<cell at remote 0x7f66567225e0>,), name='exec', qualname='CanvasApplication.exec')
    at Python/ceval.c:4298
#65 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:435
#66 0x00007f668e4c6c0a in _PyObject_Vectorcall (kwnames=0x0, nargsf=1, args=0x56353e1bb8d0, callable=<function at remote 0x7f6656726280>) at ./Include/cpython/abstract.h:127
#67 method_vectorcall (method=<optimized out>, args=0x56353e1bb8d8, nargsf=<optimized out>, kwnames=0x0) at Objects/classobject.c:60
#68 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#69 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff90732090, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#70 0x00007f668e49deca in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3469
#71 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f6656793f50>, globals=globals@entry={'__name__': 'orangecanvas.main', '__doc__': '\n', '__package__': 'orangecanvas', '__loader__': <SourceFileLoader(name='orangecanvas.main', path='/home/denolf/dev/orange-canvas-core/orangecanvas/main.py') at remote 0x7f6656794190>, '__spec__': <ModuleSpec(name='orangecanvas.main', loader=<...>, origin='/home/denolf/dev/orange-canvas-core/orangecanvas/main.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/home/denolf/dev/orange-canvas-core/orangecanvas/__pycache__/main.cpython-38.pyc', _initializing=False) at remote 0x7f6656794100>, '__file__': '/home/denolf/dev/orange-canvas-core/orangecanvas/main.py', '__cached__': '/home/denolf/dev/orange-canvas-core/orangecanvas/__pycache__/main.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <type at remote 0x56353b114ba0>, '__spec__': <ModuleSpec(name=...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=2, kwnames=0x0, kwargs=0x7f66569e38d8, kwcount=0, kwstep=1, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name='run', qualname='Main.run') at Python/ceval.c:4298
#72 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:435
#73 0x00007f668e4c6c0a in _PyObject_Vectorcall (kwnames=0x0, nargsf=2, args=0x7f66569e38c8, callable=<function at remote 0x7f6656729430>) at ./Include/cpython/abstract.h:127
#74 method_vectorcall (method=<optimized out>, args=0x7f66569e38d0, nargsf=<optimized out>, kwnames=0x0) at Objects/classobject.c:60
#75 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#76 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff907323e0, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#77 0x00007f668e49deca in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3469
#78 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f665678fa80>, globals=globals@entry={'__name__': 'Orange.canvas.__main__', '__doc__': '\nOrange Canvas main entry point\n\n', '__package__': 'Orange.canvas', '__loader__': <SourceFileLoader(name='Orange.canvas.__main__', path='/home/denolf/dev/orange3/Orange/canvas/__main__.py') at remote 0x7f665678c280>, '__spec__': <ModuleSpec(name='Orange.canvas.__main__', loader=<...>, origin='/home/denolf/dev/orange3/Orange/canvas/__main__.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/home/denolf/dev/orange3/Orange/canvas/__pycache__/__main__.cpython-38.pyc', _initializing=False) at remote 0x7f665678c1f0>, '__file__': '/home/denolf/dev/orange3/Orange/canvas/__main__.py', '__cached__': '/home/denolf/dev/orange3/Orange/canvas/__pycache__/__main__.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <type at remote 0x56353b114ba0>, '__spec__...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=2, kwnames=0x0, kwargs=0x7f665673c848, kwcount=0, kwstep=1, defs=0x0, defcount=0, kwdefs=0x0, closure=(<cell at remote 0x7f665678cf70>,), name='run', qualname='OMain.run')
    at Python/ceval.c:4298
#79 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:435
#80 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#81 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff907326a0, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#82 0x00007f668e49a4d4 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3486
#83 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f6656793450>, globals=globals@entry={'__name__': 'Orange.canvas.__main__', '__doc__': '\nOrange Canvas main entry point\n\n', '__package__': 'Orange.canvas', '__loader__': <SourceFileLoader(name='Orange.canvas.__main__', path='/home/denolf/dev/orange3/Orange/canvas/__main__.py') at remote 0x7f665678c280>, '__spec__': <ModuleSpec(name='Orange.canvas.__main__', loader=<...>, origin='/home/denolf/dev/orange3/Orange/canvas/__main__.py', loader_state=None, submodule_search_locations=None, _set_fileattr=True, _cached='/home/denolf/dev/orange3/Orange/canvas/__pycache__/__main__.cpython-38.pyc', _initializing=False) at remote 0x7f665678c1f0>, '__file__': '/home/denolf/dev/orange3/Orange/canvas/__main__.py', '__cached__': '/home/denolf/dev/orange3/Orange/canvas/__pycache__/__main__.cpython-38.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <type at remote 0x56353b114ba0>, '__spec__...(truncated), locals=locals@entry=0x0, args=<optimized out>, argcount=1, kwnames=0x0, kwargs=0x56353e18ca78, kwcount=0, kwstep=1, defs=0x7f665678ce98, defcount=1, kwdefs=0x0, closure=0x0, name='main', qualname='main') at Python/ceval.c:4298
#84 0x00007f668e4c3234 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:435
#85 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#86 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff90732968, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#87 0x00007f668e499a75 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3500
#88 0x00007f668e49517b in function_code_fastcall (co=<optimized out>, args=<optimized out>, nargs=1, globals=<optimized out>) at Objects/call.c:283
#89 0x00007f668e4964ad in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:123
#90 call_function (tstate=tstate@entry=0x56353b103bb0, pp_stack=pp_stack@entry=0x7fff90732b48, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963
#91 0x00007f668e499a75 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3500
#92 0x00007f668e5a97bb in _PyEval_EvalCodeWithName
    (_co=_co@entry=<code at remote 0x7f668da03660>, globals=globals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, locals=locals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, args=args@entry=0x0, argcount=argcount@entry=0, kwnames=kwnames@entry=0x0, kwargs=0x0, kwcount=0, kwstep=2, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name=0x0, qualname=0x0)
    at Python/ceval.c:4298
#93 0x00007f668e5a9b42 in PyEval_EvalCodeEx
    (_co=_co@entry=<code at remote 0x7f668da03660>, globals=globals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, locals=locals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, args=args@entry=0x0, argcount=argcount@entry=0, kws=kws@entry=0x0, kwcount=0, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0) at Python/ceval.c:4327
#94 0x00007f668e5a9b6f in PyEval_EvalCode
    (co=co@entry=<code at remote 0x7f668da03660>, globals=globals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, locals=locals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <f--Type <RET> for more, q to quit, c to continue without paging--
unction at remote 0x7f6656741280>}) at Python/ceval.c:718
#95 0x00007f668e5e99fc in run_eval_code_obj
    (locals={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, globals={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, co=0x7f668da03660)
    at Python/pythonrun.c:1125
#96 run_mod
    (mod=mod@entry=0x56353b1d53d0, filename=filename@entry='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', globals=globals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, locals=locals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, flags=flags@entry=0x7fff90732e48, arena=arena@entry=0x7f668dac8550) at Python/pythonrun.c:1147
#97 0x00007f668e5eb376 in PyRun_FileExFlags
    (fp=fp@entry=0x56353b102220, filename_str=filename_str@entry=0x7f668d9ac9f0 "/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas", start=start@entry=257, globals=globals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, locals=locals@entry={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <SourceFileLoader(name='__main__', path='/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas') at remote 0x7f668da2c6d0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module at remote 0x7f668da57090>, '__file__': '/users/denolf/virtualenvs/ewoks/ubuntu_20_04/py38/bin/ewoks-canvas', '__cached__': None, 're': <module at remote 0x7f668d869590>, 'sys': <module at remote 0x7f668da4ce00>, 'main': <function at remote 0x7f6656741280>}, closeit=closeit@entry=1, flags=0x7fff90732e48)
    at Python/pythonrun.c:1063
#98 0x00007f668e5eb4df in PyRun_SimpleFileExFlags (fp=fp@entry=0x56353b102220, filename=<optimized out>, closeit=closeit@entry=1, flags=flags@entry=0x7fff90732e48) at Python/pythonrun.c:428
#99 0x00007f668e5eba3c in PyRun_AnyFileExFlags (fp=fp@entry=0x56353b102220, filename=<optimized out>, closeit=closeit@entry=1, flags=flags@entry=0x7fff90732e48) at Python/pythonrun.c:86
#100 0x00007f668e609ad8 in pymain_run_file (cf=0x7fff90732e48, config=0x56353b102b80) at Modules/main.c:381
#101 pymain_run_python (exitcode=0x7fff90732e3c) at Modules/main.c:606
#102 Py_RunMain () at Modules/main.c:685
#103 0x00007f668e609f7a in pymain_main (args=0x7fff90732f40) at Modules/main.c:715
#104 Py_BytesMain (argc=<optimized out>, argv=<optimized out>) at Modules/main.c:739
#105 0x00007f668e234083 in __libc_start_main (main=0x56353a1d1060 <main>, argc=3, argv=0x7fff907330a8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff90733098)
    at ../csu/libc-start.c:308
#106 0x000056353a1d109e in _start ()
Steps to reproduce the behavior

I can upload the workflow and the data (~1GB) somewhere if you want a way to reproduce the problem.

LDAvis: error on report (blank ldavis)

Orange version

3.35.0dev

Expected behavior

Show blank report.

Actual behavior
Traceback (most recent call last):
  File "c:\users\anja\documents\pumice\orange-widget-base-si\orangewidget\workflow\errorreporting.py", line 281, in handle_exception
    return ErrorReporting.handle_exception(exc)
  File "C:\Users\Anja\miniconda3\envs\orange\lib\unittest\mock.py", line 1379, in patched
    return func(*newargs, **newkeywargs)
  File "c:\users\anja\documents\pumice\orange-widget-base-si\orangewidget\workflow\errorreporting.py", line 277, in handle_exception
    cls(data=data).exec()
  File "c:\users\anja\documents\pumice\orange-widget-base-si\orangewidget\workflow\errorreporting.py", line 145, in __init__
    _reload_text()
  File "c:\users\anja\documents\pumice\orange-widget-base-si\orangewidget\workflow\errorreporting.py", line 133, in _reload_text
    v = '<a href="{}">{}</a>'.format(urljoin('file:', pathname2url(_v)), v)
  File "C:\Users\Anja\miniconda3\envs\orange\lib\nturl2path.py", line 73, in pathname2url
    raise OSError(error)
OSError: Bad path: <?xml version='1.0' encoding='utf-8'?>
<scheme version="2.0" title="" description="">
        <nodes>                
Steps to reproduce the behavior

Open Orange, on blank cavas add LDAvis and click report icon.

TimeoutError() in webview: better error message

Orange version

3.24.dev

Expected behavior

User gets an informative message.

Actual behavior

An error appears and probably most users won't understand why this happens and how to fix it.

Steps to reproduce the behavior

Load a large data set and open a widget with a webview, say Line Chart.

Additional info (worksheets, data, screenshots, ...)

The error keeps popping up and when I close it, I can still see the plot.

Dynamically add Input, Output, Settings, ...

As we are trying to create a mapping between our common task graph representation (to be scheduled with luigi, dask and other task schedulers), we end up with lots of boilerplate code for each widget:

from Orange.widgets import gui
from Orange.widgets.widget import OWWidget, Input, Output
from Orange.widgets.settings import Setting

from esrf2orange3 import OWWidgetTaskExecutor
from esrf2orange3.gui.parameterform import ParameterForm
from tasklib import SumTask
from esrftaskgraph import Variable


__all__ = ["Adder1"]


class Adder1(OWWidget):
    name = "Adder1"
    description = "Adds two numbers"
    want_main_area = False
    esrftaskclass = SumTask

    class Inputs:
        a = Input("A", Variable)
        b = Input("B", Variable)

    class Outputs:
        result = Output("A + B", Variable)

    static_input = Setting({"a": 0, "b": 0})
    varinfo = Setting({"root_uri": "/tmp"})

    def __init__(self):
        super().__init__()

        self._esrfexecutor = OWWidgetTaskExecutor(self)

        box = gui.widgetBox(self.controlArea, "Static Inputs")
        self._static_input_form = ParameterForm(parent=box)
        for name in self._esrfexecutor.input_names:
            value = self.static_input.get(name, 0)
            self._static_input_form.addParameter(
                name, value=value, changeCallback=self.changeStaticInput
            )

        box = gui.widgetBox(self.controlArea, "Dynamic Inputs")
        self._dynamic_input_form = ParameterForm(parent=box)
        for name in self._esrfexecutor.input_names:
            self._dynamic_input_form.addParameter(name)

        box = gui.widgetBox(self.controlArea, "Outputs")
        self._output_form = ParameterForm(parent=box)
        for name in self._esrfexecutor.output_names:
            self._output_form.addParameter(name)

        self.handleNewSignals()

    def changeStaticInput(self):
        self.static_input.update(self._static_input_form.getParameters())
        self.handleNewSignals()

    @Inputs.a
    def settera(self, var):
        self._esrfexecutor.set_input("a", var)

    @Inputs.b
    def setterb(self, var):
        self._esrfexecutor.set_input("b", var)

    def handleNewSignals(self):
        for name, value in self._esrfexecutor.dynamic_input_values.items():
            self._dynamic_input_form.setParameter(name, value)
            self._static_input_form.disable(name)
        self._esrfexecutor.run()
        for name, value in self._esrfexecutor.output_values.items():
            self._output_form.setParameter(name, value)

The Inputs, Ouputs, Setting as well as the input setters are all boilerplate (can be derived from SumTask). Any suggestions on how we can add those class attributes dynamically? It seems subclassing OWWidget is forbidden for some reason (#144). How about adding a metaclass?

ColoredBarItemDelegate: Crashes on data with missing values

Orange version

Master

Actual behavior

Rank and similar widgets (that use ColoredBarItemDelegate) crash on data with missing values.

I think the problem appears due to #186.

Steps to reproduce the behavior

File (heart disease) -> Rank (check ANOVA):

Traceback (most recent call last):
  File "/Users/vesna/orange-widget-base/orangewidget/gui.py", line 2784, in paint
    bar_rect.setWidth(max(0, min(int(w * ratio), w)))
ValueError: cannot convert float NaN to integer

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.