Skip to content

Commit

Permalink
Merge pull request #2318 from ales-erjavec/doc/tutorial-responsive-gui
Browse files Browse the repository at this point in the history
[ENH] Add a tutorial section on responsive GUI
  • Loading branch information
janezd authored Jun 9, 2017
2 parents c1c3a18 + e28e9fc commit f735732
Show file tree
Hide file tree
Showing 12 changed files with 747 additions and 86 deletions.
1 change: 1 addition & 0 deletions Orange/evaluation/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ def split_by_model(self):
res = Results()
res.data = data
res.domain = self.domain
res.learners = [self.learners[i]]
res.row_indices = self.row_indices
res.actual = self.actual
res.folds = self.folds
Expand Down
1 change: 1 addition & 0 deletions Orange/tests/test_evaluation_testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ def test_split_by_model(self):
self.assertEqual(len(result.models), 5)
for model in result.models:
self.assertIsInstance(model, learners[i].__returns__)
self.assertSequenceEqual(result.learners, [res.learners[i]])

def test_10_fold_probs(self):
learners = [MajorityLearner(), MajorityLearner()]
Expand Down
2 changes: 1 addition & 1 deletion Orange/widgets/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -3115,7 +3115,7 @@ def table(widget, rows=0, columns=0, selectionMode=-1, addToLayout=True):
if selectionMode != -1:
w.setSelectionMode(selectionMode)
w.setHorizontalScrollMode(QtWidgets.QTableWidget.ScrollPerPixel)
w.horizontalHeader().setMovable(True)
w.horizontalHeader().setSectionsMovable(True)
return w


Expand Down
1 change: 1 addition & 0 deletions doc/development/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Widget Development
tutorial-cont
tutorial-settings
tutorial-channels
tutorial-responsive-gui
tutorial-utilities
widget
gui
Expand Down
14 changes: 9 additions & 5 deletions doc/development/source/orange-demo/orangedemo/OWDataSamplerA.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,13 @@ def set_data(self, dataset):
self.Outputs.sample.send("Sampled Data")
# [end-snippet-2]


# [start-snippet-3]
def main(argv=sys.argv):
from PyQt4.QtGui import QApplication
app = QApplication(list(argv))
def main(argv=None):
from AnyQt.QtWidgets import QApplication
# PyQt changes argv list in-place
app = QApplication(list(argv) if argv else [])
argv = app.arguments()
if len(argv) > 1:
filename = argv[1]
else:
Expand All @@ -64,9 +67,10 @@ def main(argv=sys.argv):
app.exec_()
ow.set_data(None)
ow.handleNewSignals()
ow.onDeleteWidget()
return 0

if __name__=="__main__":
sys.exit(main())
if __name__ == "__main__":
sys.exit(main(sys.argv))

# [end-snippet-3]
15 changes: 10 additions & 5 deletions doc/development/source/orange-demo/orangedemo/OWDataSamplerB.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from Orange.widgets.widget import OWWidget, Input, Output, settings
from Orange.widgets import gui


# [start-snippet-1]
class OWDataSamplerB(OWWidget):
name = "Data Sampler (B)"
Expand Down Expand Up @@ -81,9 +82,12 @@ def checkCommit(self):
self.commit()
# [end-snippet-4]

def main(argv=sys.argv):
from PyQt4.QtGui import QApplication
app = QApplication(list(argv))

def main(argv=None):
from AnyQt.QtWidgets import QApplication
# PyQt changes argv list in-place
app = QApplication(list(argv) if argv else [])
argv = app.arguments()
if len(argv) > 1:
filename = argv[1]
else:
Expand All @@ -99,7 +103,8 @@ def main(argv=sys.argv):
app.exec_()
ow.set_data(None)
ow.handleNewSignals()
ow.onDeleteWidget()
return 0

if __name__=="__main__":
sys.exit(main())
if __name__ == "__main__":
sys.exit(main(sys.argv))
16 changes: 10 additions & 6 deletions doc/development/source/orange-demo/orangedemo/OWDataSamplerC.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def __init__(self):

self.resize(100,50)

@Input.data
@Inputs.data
def set_data(self, dataset):
if dataset is not None:
self.dataset = dataset
Expand Down Expand Up @@ -84,9 +84,12 @@ def checkCommit(self):
if self.commitOnChange:
self.commit()

def main(argv=sys.argv):
from PyQt4.QtGui import QApplication
app = QApplication(list(argv))

def main(argv=None):
from AnyQt.QtWidgets import QApplication
# PyQt changes argv list in-place
app = QApplication(list(argv) if argv else [])
argv = app.arguments()
if len(argv) > 1:
filename = argv[1]
else:
Expand All @@ -102,7 +105,8 @@ def main(argv=sys.argv):
app.exec_()
ow.set_data(None)
ow.handleNewSignals()
ow.onDeleteWidget()
return 0

if __name__=="__main__":
sys.exit(main())
if __name__ == "__main__":
sys.exit(main(sys.argv))
19 changes: 9 additions & 10 deletions doc/development/source/orange-demo/orangedemo/OWLearningCurveA.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
from collections import OrderedDict

import numpy
from PyQt4.QtGui import QTableWidget, QTableWidgetItem
from AnyQt.QtWidgets import QTableWidget, QTableWidgetItem

import Orange.data
import Orange.classification
import Orange.evaluation

from Orange.widgets import gui, settings
from Orange.widgets.widget import OWWidget, Input
Expand Down Expand Up @@ -179,14 +180,11 @@ def _update(self):

learners = [learner for _, learner in need_update]

self.progressBarInit()
# compute the learning curve result for all learners in one go
results = learning_curve(
learners, self.data, folds=self.folds,
proportions=self.curvePoints,
callback=lambda value: self.progressBarSet(100 * value)
)
self.progressBarFinished()
# split the combined result into per learner/model results
results = [list(Results.split_by_model(p_results))
for p_results in results]
Expand Down Expand Up @@ -259,10 +257,10 @@ def select_proportion_preproc(data, p, rstate=None):
return results


def main(argv=sys.argv):
from PyQt4.QtGui import QApplication
app = QApplication(argv)
argv = app.argv()
def main(argv=None):
from AnyQt.QtWidgets import QApplication
app = QApplication(list(argv) if argv else [])
argv = app.arguments()
if len(argv) > 1:
filename = argv[1]
else:
Expand Down Expand Up @@ -297,7 +295,8 @@ def main(argv=sys.argv):
ow.set_learner(None, 2)
ow.set_learner(None, 3)
ow.handleNewSignals()
ow.onDeleteWidget()
return 0

if __name__=="__main__":
sys.exit(main())
if __name__ == "__main__":
sys.exit(main(sys.argv))
27 changes: 14 additions & 13 deletions doc/development/source/orange-demo/orangedemo/OWLearningCurveB.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
from functools import reduce

import numpy
import sklearn.cross_validation

from PyQt4.QtGui import QTableWidget, QTableWidgetItem
from AnyQt.QtWidgets import QTableWidget, QTableWidgetItem

import Orange.data
import Orange.classification
import Orange.evaluation

from Orange.widgets import gui, settings
from Orange.widgets.widget import OWWidget, Input
Expand Down Expand Up @@ -193,22 +193,17 @@ def _update(self):
return
learners = [learner for _, learner in need_update]

self.progressBarInit()
if self.testdata is None:
# compute the learning curve result for all learners in one go
results = learning_curve(
learners, self.data, folds=self.folds,
proportions=self.curvePoints,
callback=lambda value: self.progressBarSet(100 * value)
)
else:
results = learning_curve_with_test_data(
learners, self.data, self.testdata, times=self.folds,
proportions=self.curvePoints,
callback=lambda value: self.progressBarSet(100 * value)
)

self.progressBarFinished()
# split the combined result into per learner/model results
results = [list(Results.split_by_model(p_results)) for p_results in results]

Expand Down Expand Up @@ -279,6 +274,7 @@ def select_proportion_preproc(data, p, rstate=None):
]
return results


def learning_curve_with_test_data(learners, traindata, testdata, times=10,
proportions=None, random_state=None,
callback=None):
Expand Down Expand Up @@ -327,6 +323,9 @@ def is_empty(res):
assert x.domain is y.domain
assert x.predicted.shape[0] == y.predicted.shape[0]

assert len(x.learners) == len(y.learners)
assert all(xl is yl for xl, yl in zip(x.learners, y.learners))

row_indices = numpy.hstack((x.row_indices, y.row_indices))
predicted = numpy.hstack((x.predicted, y.predicted))
actual = numpy.hstack((x.actual, y.actual))
Expand All @@ -344,6 +343,7 @@ def is_empty(res):
res = Orange.evaluation.Results()
res.data = x.data
res.domain = x.domain
res.learners = x.learners
res.row_indices = row_indices
res.actual = actual
res.predicted = predicted
Expand All @@ -363,10 +363,10 @@ def is_empty(res):
return res


def main(argv=sys.argv):
from PyQt4.QtGui import QApplication
app = QApplication(argv)
argv = app.argv()
def main(argv=None):
from AnyQt.QtWidgets import QApplication
app = QApplication(list(argv) if argv else [])
argv = app.arguments()
if len(argv) > 1:
filename = argv[1]
else:
Expand Down Expand Up @@ -407,7 +407,8 @@ def main(argv=sys.argv):
ow.set_learner(None, 2)
ow.set_learner(None, 3)
ow.handleNewSignals()
ow.onDeleteWidget()
return 0

if __name__=="__main__":
sys.exit(main())
if __name__ == "__main__":
sys.exit(main(sys.argv))
Loading

0 comments on commit f735732

Please sign in to comment.