From b64d04bd091ee41f6d98b70107280076c590df29 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 30 May 2016 16:46:38 +0200 Subject: [PATCH 1/6] tests added for gui init --- pygem/gui.py | 67 +++++++++++++++++++++++---------------------- tests/test_utils.py | 2 +- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/pygem/gui.py b/pygem/gui.py index 6bff6b0..a08c929 100644 --- a/pygem/gui.py +++ b/pygem/gui.py @@ -125,75 +125,76 @@ def start(self): """ The method inizializes and visualizes the window. """ - + + logo_panel = Tkinter.Label() + logo_panel.pack(side = "bottom", padx = 5, pady = 5,anchor=Tkinter.SE) image = Image.open('readme/logo_PyGeM_small.png') image = image.resize((50, 50), Image.ANTIALIAS) img = ImageTk.PhotoImage(image) - panel = Label(self.root, image = img) - panel.pack(side = "bottom", padx = 5, pady = 5,anchor=SE) + logo_panel.configure(image = img) - geo_frame = Frame(self.root) - geo_frame.pack(anchor=W) + geo_frame = Tkinter.Frame(self.root) + geo_frame.pack(anchor=Tkinter.W) # Buttons 1 button_1 = Tkinter.Button(geo_frame, text ="Pick the geometry", command = self._chose_geometry) - button_1.pack(side=LEFT, padx = 5, pady = 5) - self.label_geo=Label(geo_frame, textvariable=self.print_geometry_path, fg='red') + button_1.pack(side=Tkinter.LEFT, padx = 5, pady = 5) + self.label_geo=Tkinter.Label(geo_frame, textvariable=self.print_geometry_path, fg='red') self.print_geometry_path.set("No geometry chosen!") - self.label_geo.pack(side=LEFT, padx = 5, pady = 5) + self.label_geo.pack(side=Tkinter.LEFT, padx = 5, pady = 5) # Button 2 - params_frame = Frame(self.root) - params_frame.pack(anchor=W) + params_frame = Tkinter.Frame(self.root) + params_frame.pack(anchor=Tkinter.W) button_2 = Tkinter.Button(params_frame, text ="Pick the parameters", command = self._chose_parameters) - button_2.pack(side=LEFT, padx = 5, pady = 5) - self.label_params = Label( params_frame, textvariable=self.print_parameter_path, fg='red') + button_2.pack(side=Tkinter.LEFT, padx = 5, pady = 5) + self.label_params = Tkinter.Label( params_frame, textvariable=self.print_parameter_path, fg='red') self.print_parameter_path.set("No parameters file chosen!") - self.label_params.pack(side=LEFT, padx = 5, pady = 5) + self.label_params.pack(side=Tkinter.LEFT, padx = 5, pady = 5) # Entry - entryframe = Frame(self.root) - entryframe.pack(padx = 5, pady = 5, anchor=W) + entryframe = Tkinter.Frame(self.root) + entryframe.pack(padx = 5, pady = 5, anchor=Tkinter.W) - label_geo_out = Label(entryframe, text="Output geometry file") - label_geo_out.pack( side = LEFT) - entry_geo_out = Entry(entryframe, bd =5, textvariable=self.outfilename) - entry_geo_out.pack(side = LEFT) + label_geo_out = Tkinter.Label(entryframe, text="Output geometry file") + label_geo_out.pack( side = Tkinter.LEFT) + entry_geo_out = Tkinter.Entry(entryframe, bd =5, textvariable=self.outfilename) + entry_geo_out.pack(side = Tkinter.LEFT) # Checkboxes - checkframe_orig = Frame(self.root) - checkframe_orig.pack(anchor=W) + checkframe_orig = Tkinter.Frame(self.root) + checkframe_orig.pack(anchor=Tkinter.W) - check_lattice_orig = Checkbutton(checkframe_orig, text = "Dump Original FFD lattice", variable = self.check_var_1, \ + check_lattice_orig = Tkinter.Checkbutton(checkframe_orig, text = "Dump Original FFD lattice", variable = self.check_var_1, \ onvalue = 1, offvalue = 0, height=3, \ width = 20) - check_lattice_orig.pack(side=LEFT) + check_lattice_orig.pack(side=Tkinter.LEFT) - entry_lattice_orig = Entry(checkframe_orig, bd =5, textvariable=self.outfilename_lattice_orig) - entry_lattice_orig.pack(side = LEFT) + entry_lattice_orig = Tkinter.Entry(checkframe_orig, bd =5, textvariable=self.outfilename_lattice_orig) + entry_lattice_orig.pack(side = Tkinter.LEFT) - checkframe_mod = Frame(self.root) - checkframe_mod.pack(anchor=W) + checkframe_mod = Tkinter.Frame(self.root) + checkframe_mod.pack(anchor=Tkinter.W) - check_lattice_mod = Checkbutton(checkframe_mod, text = "Dump Morphed FFD lattice", variable = self.check_var_2, \ + check_lattice_mod = Tkinter.Checkbutton(checkframe_mod, text = "Dump Morphed FFD lattice", variable = self.check_var_2, \ onvalue = 1, offvalue = 0, height=3, \ width = 20) - check_lattice_mod.pack(side=LEFT) + check_lattice_mod.pack(side=Tkinter.LEFT) - entry_lattice_mod = Entry(checkframe_mod, bd =5, textvariable=self.outfilename_lattice_mod) - entry_lattice_mod.pack(side = LEFT) + entry_lattice_mod = Tkinter.Entry(checkframe_mod, bd =5, textvariable=self.outfilename_lattice_mod) + entry_lattice_mod.pack(side = Tkinter.LEFT) # Run button button_run = Tkinter.Button(self.root, text ="Run PyGeM", command = self._run_simulation, bg='#065893', fg='#f19625', font='bold') button_run.pack() # Menu - menubar = Menu(self.root) + menubar = Tkinter.Menu(self.root) - helpmenu = Menu(menubar, tearoff=0) + helpmenu = Tkinter.Menu(menubar, tearoff=0) helpmenu.add_command(label="About...", command=self._goto_website) menubar.add_cascade(label="Help", menu=helpmenu) diff --git a/tests/test_utils.py b/tests/test_utils.py index cbb6f56..4cc6f65 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -9,7 +9,7 @@ import vtk -class TestVtkHandler(TestCase): +class TestUtils(TestCase): def test_utils_write_original_box(self): From df16c3679eb8a94c40ff3d3f71b6492db3d78c9f Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 30 May 2016 16:55:05 +0200 Subject: [PATCH 2/6] tests added for gui init --- tests/test_gui.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tests/test_gui.py diff --git a/tests/test_gui.py b/tests/test_gui.py new file mode 100644 index 0000000..b3be7c0 --- /dev/null +++ b/tests/test_gui.py @@ -0,0 +1,80 @@ + +from unittest import TestCase +import unittest +import pygem.gui as gui +import Tkinter +from tkFileDialog import askopenfilename +from PIL import ImageTk, Image + + +class TestGui(TestCase): + + def test_gui_init_string_1(self): + gui_handler = gui.Gui() + assert gui_handler.root.title() == 'PyGeM' + + + def test_gui_init_string_2(self): + gui_handler = gui.Gui() + assert gui_handler.filename_geometry.get() == '' + + + def test_gui_init_string_3(self): + gui_handler = gui.Gui() + assert gui_handler.filename_parameters.get() == '' + + + def test_gui_init_string_4(self): + gui_handler = gui.Gui() + assert gui_handler.outfilename.get() == '' + + + def test_gui_init_string_5(self): + gui_handler = gui.Gui() + assert gui_handler.outfilename_lattice_orig.get() == '' + + + def test_gui_init_string_6(self): + gui_handler = gui.Gui() + assert gui_handler.outfilename_lattice_mod.get() == '' + + + def test_gui_init_string_7(self): + gui_handler = gui.Gui() + assert gui_handler.print_geometry_path.get() == '' + + + def test_gui_init_string_8(self): + gui_handler = gui.Gui() + assert gui_handler.print_parameter_path.get() == '' + + + def test_gui_init_string_9(self): + gui_handler = gui.Gui() + assert gui_handler.url == 'https://github.com/mathLab/PyGeM' + + + def test_gui_init_int_1(self): + gui_handler = gui.Gui() + assert gui_handler.check_var_1.get() == 0 + + + def test_gui_init_int_2(self): + gui_handler = gui.Gui() + assert gui_handler.check_var_2.get() == 0 + + + def test_gui_init_none_1(self): + gui_handler = gui.Gui() + assert gui_handler.label_geo == None + + + def test_gui_init_none_2(self): + gui_handler = gui.Gui() + assert gui_handler.label_params == None + + + def test_gui_init_all(self): + gui.Gui() + + From 3833ca6cda901e7d3de03a225d6719adb90ea2b6 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 30 May 2016 17:23:05 +0200 Subject: [PATCH 3/6] test for the main part of gui code --- pygem/gui.py | 16 +++++++++++----- tests/test_gui.py | 5 +++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/pygem/gui.py b/pygem/gui.py index a08c929..242c22c 100644 --- a/pygem/gui.py +++ b/pygem/gui.py @@ -54,6 +54,9 @@ def __init__(self): self.label_params = None self.url = 'https://github.com/mathLab/PyGeM' + self.logo_label = None + self.img = None + def _chose_geometry(self): @@ -121,17 +124,17 @@ def _goto_website(self): webbrowser.open(self.url) - def start(self): + def main(self): """ The method inizializes and visualizes the window. """ - logo_panel = Tkinter.Label() - logo_panel.pack(side = "bottom", padx = 5, pady = 5,anchor=Tkinter.SE) + self.logo_panel = Tkinter.Label() + self.logo_panel.pack(side = "bottom", padx = 5, pady = 5,anchor=Tkinter.SE) image = Image.open('readme/logo_PyGeM_small.png') image = image.resize((50, 50), Image.ANTIALIAS) - img = ImageTk.PhotoImage(image) - logo_panel.configure(image = img) + self.img = ImageTk.PhotoImage(image) + self.logo_panel.configure(image = self.img) geo_frame = Tkinter.Frame(self.root) geo_frame.pack(anchor=Tkinter.W) @@ -200,5 +203,8 @@ def start(self): self.root.config(menu=menubar) + + def start(self): + self.root.mainloop() diff --git a/tests/test_gui.py b/tests/test_gui.py index b3be7c0..b6d8184 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -77,4 +77,9 @@ def test_gui_init_none_2(self): def test_gui_init_all(self): gui.Gui() + + def test_gui_main(self): + interface = gui.Gui() + interface.main() + From 9671aa8667a0eb3b29057afe36aa277820e5ff21 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 30 May 2016 17:34:46 +0200 Subject: [PATCH 4/6] test for the main part of gui code --- tests/test_gui.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_gui.py b/tests/test_gui.py index b6d8184..771072e 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -2,9 +2,6 @@ from unittest import TestCase import unittest import pygem.gui as gui -import Tkinter -from tkFileDialog import askopenfilename -from PIL import ImageTk, Image class TestGui(TestCase): From acc1c626d68be66645e7ea458396dad0abace137 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Tue, 31 May 2016 09:55:45 +0200 Subject: [PATCH 5/6] try to pass test on travis + gui added to documentation --- .travis.yml | 3 +-- README.md | 13 +++++++++++++ readme/gui_PyGeM.png | Bin 0 -> 30066 bytes 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 readme/gui_PyGeM.png diff --git a/.travis.yml b/.travis.yml index 6164e05..b06a40e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,14 +43,13 @@ install: conda create --yes -n test python="2.7"; fi - source activate test - - conda install --yes numpy scipy matplotlib pip nose vtk + - conda install --yes numpy scipy matplotlib pip nose vtk pillow - conda install --yes -c https://conda.anaconda.org/dlr-sc pythonocc-core - pip install setuptools - pip install enum34 - pip install numpy-stl - pip install coveralls - pip install coverage - - pip install Pillow - python setup.py install script: coverage run test.py diff --git a/README.md b/README.md index 0a65f58..ebe856f 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,19 @@ To uninstall the package you have to rerun the installation and record the insta The generated html can be found in `docs/build/html`. Open up the `index.html` you find there to browse. +## Gui +**PyGeM** comes with a very basic Graphic Unit Interface. + +Pick the geometry, the parameters file, set the name of the output and decide whether dump the FFD lattice or not. +Now just click on the `Run PyGeM` button and that is it. + +

+ +

+

+PyGeM GUI: how it appears when it pops up. +

+ ## Testing We are using Travis CI for continuous intergration testing. You can check out the current status [here](https://travis-ci.org/mathLab/PyGeM). diff --git a/readme/gui_PyGeM.png b/readme/gui_PyGeM.png new file mode 100644 index 0000000000000000000000000000000000000000..a118fe606bf2a2da06201f9e7eb67b77010a2d90 GIT binary patch literal 30066 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 literal 0 HcmV?d00001 From d8029222182710fba4f5bf118d3616470a546ffd Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Tue, 31 May 2016 10:09:20 +0200 Subject: [PATCH 6/6] try to pass test on travis + gui added to documentation --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b06a40e..b7f6750 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,13 +43,16 @@ install: conda create --yes -n test python="2.7"; fi - source activate test - - conda install --yes numpy scipy matplotlib pip nose vtk pillow + - conda install --yes numpy scipy matplotlib pip nose vtk - conda install --yes -c https://conda.anaconda.org/dlr-sc pythonocc-core - pip install setuptools - pip install enum34 - pip install numpy-stl - pip install coveralls - pip install coverage + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + pip install Pillow; + fi - python setup.py install script: coverage run test.py