Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • msdt/team1920-speechcomparison
1 result
Show changes
Commits on Source (35)
Infinitief,verleden tijd enkelvoud,verleden tijd meervoud,voltooid deelwoord
bakken,bakte,bakten,gebakken
bannen,bande,banden,gebannen
barsten,barstte,barstten,gebarsten
bederven,bedierf,bedierven,bedorven
bedriegen,bedroog,bedrogen,bedrogen
beginnen,begon,begonnen,begonnen
begrijpen,begreep,begrepen,begrepen
behangen,behing,behingen,behangen
bergen,borg,borgen,geborgen
bevallen,beviel,bevielen,bevallen
bevelen,beval,bevalen,bevolen
bewegen,bewoog,bewogen,bewogen
bezoeken,bezocht,bezochten,bezocht
bezwijken,bezweek,bezweken,bezweken
bidden,bad,baden,gebeden
bieden,bood,boden,geboden
bijten,beet,beten,gebeten
binden,bond,bonden,gebonden
blazen,blies,bliezen,geblazen
blijken,bleek,bleken,gebleken
blijven,bleef,bleven,gebleven
blinken,blonk,blonken,geblonken
braden,braadde,braadden,gebraden
breken,brak,braken,gebroken
brengen,bracht,brachten,gebracht
brouwen,brouwde,brouwden,gebrouwen
buigen,boog,bogen,gebogen
denken,dacht,dachten,gedacht
dingen naar,dong naar,dongen naar,gedongen naar
doen,deed,deden,gedaan
dragen,droeg,droegen,gedragen
drijven,dreef,dreven,gedreven
dringen,drong,drongen,gedrongen
drinken,dronk,dronken,gedronken
druipen,droop,dropen,gedropen
duiken,dook,doken,gedoken
dwingen,dwong,dwongen,gedwongen
ervaren,ervoer,ervoeren,ervaren
eten,at,aten,gegeten
fluiten,floot,floten,gefloten
gaan,ging,gingen,gegaan
gelden,gold,golden,gegolden
genezen,genas,genazen,genezen
genieten,genoot,genoten,genoten
geven,gaf,gaven,gegeven
gieten,goot,goten,gegoten
glijden,gleed,gleden,gegleden
glimmen,glom,glommen,geglommen
graven,groef,groeven,gegraven
grijpen,greep,grepen,gegrepen
hangen,hing,hingen,gehangen
hebben,had,hadden,gehad
heffen,hief,hieven,geheven
helpen,hielp,hielpen,geholpen
heten,heette,heetten,geheten
hijsen,hees,hesen,gehesen
hoeven,hoefde,hoefden,gehoeven
houden,hield,hielden,gehouden
houwen,hieuw,hieuwen,gehouwen
jagen,joeg,joegen,gejaagd
jagen,jaagde,jaagden,gejaagd
kiezen,koos,kozen,gekozen
kijken,keek,keken,gekeken
klimmen,klom,klommen,geklommen
klinken,klonk,klonken,geklonken
kluiven,kloof,kloven,gekloven
knijpen,kneep,knepen,geknepen
komen,kwam,kwamen,gekomen
kopen,kocht,kochten,gekocht
krijgen,kreeg,kregen,gekregen
krimpen,kromp,krompen,gekrompen
kruipen,kroop,kropen,gekropen
kunnen,kon,konden,gekund
lachen,lachte,lachten,gelachen
laden,laadde,laadden,geladen
laten,liet,lieten,gelaten
lezen,las,lazen,gelezen
liegen,loog,logen,gelogen
liggen,lag,lagen,gelegen
lijden,leed,leden,geleden
lijken,leek,leken,geleken
lopen,liep,liepen,gelopen
malen,maalde,maalden,gemalen
melken,molk,molken,gemolken
melken,melkte,melkten,gemolken
meten,mat,maten,gemeten
mijden,meed,meden,gemeden
moeten,moest,moesten,gemoeten
mogen,mocht,mochten,gemogen
neerzijgen,zeeg neer,zegen neer,neergezegen
nemen,nam,namen,genomen
nijgen,neeg,negen,genegen
ontbijten,ontbeet,ontbeten,ontbeten
ontginnen,ontgon,ontgonnen,ontgonnen
ontluiken,ontlook,ontloken,ontloken
ontwerpen,ontwierp,ontwierpen,ontworpen
overlijden,overleed,overleden,overleden
plegen,placht,plachten,gepleegd
pluizen,ploos,plozen,geplozen
prijzen,prees,prezen,geprezen
raden,raadde,raadden,geraden
raden,ried,rieden,geraden
rijden,reed,reden,gereden
rijgen,reeg,regen,geregen
rijten,reet,reten,gereten
rijzen,rees,rezen,gerezen
roepen,riep,riepen,geroepen
ruiken,rook,roken,geroken
scheiden,scheidde,scheidden,gescheiden
schelden,schold,scholden,gescholden
schenden,schond,schonden,geschonden
schenken,schonk,schonken,geschonken
scheppen,shiep,schiepen,geschapen
scheppen,schiep,schiepen,geschapen
scheren,scheerde,scheerden,geschoren
scheren,schoor,schoren,geschoren
schieten,schoot,schoten,geschoten
schijnen,scheen,schenen,geschenen
schijten,scheet,scheten,gescheten
schrijden,schreed,schreden,geschreden
schrijven,schreef,schreven,geschreven
schrikken,schrok,schrokken,geschrokken
schuilen,school,scholen,gescholen
schuilen,schuilde,schuilden,geschuild
schuiven,schoof,schoven,geschoven
slaan,sloeg,sloegen,geslagen
slapen,sliep,sliepen,geslapen
slijpen,sleep,slepen,geslepen
slijten,sleet,sleten,gesleten
slinken,slonk,slonken,geslonken
sluipen,sloop,slopen,geslopen
sluiten,sloot,sloten,gesloten
smelten,smolt,smolten,gesmolten
smijten,smeet,smeten,gesmeten
snijden,sneed,sneden,gesneden
snuiten,snoot,snoten,gesnoten
snuiven,snoof,snoven,gesnoven
spannen,spande,spanden,gespannen
spijten,speet,speten,gespeten
spinnen,spon,sponnen,gesponnen
splijten,spleet,spleten,gespleten
spreken,sprak,spraken,gesproken
springen,sprong,sprongen,gesprongen
spruiten,sproot,sproten,gesproten
spuiten,spoot,spoten,gespoten
staan,stond,stonden,gestaan
steken,stak,staken,gestoken
stelen,stal,stalen,gestolen
sterven,stierf,stierven,gestorven
stijgen,steeg,stegen,gestegen
stijven,steef,steven,gesteven
stinken,stonk,stonken,gestonken
stoten,stootte,stootten,gestoten
strijden,streed,streden,gestreden
strijken,streek,streken,gestreken
stuiven,stoof,stoven,gestoven
treden,trad,traden,getreden
treffen,trof,troffen,getroffen
trekken,trok,trokken,getrokken
vallen,viel,vielen,gevallen
vangen,ving,vingen,gevangen
varen,voer,voeren,gevaren
vechten,vocht,vochten,gevochten
verbieden,verbood,verboden,verboden
verbinden,verbond,verbonden,verbonden
verdrieten,verdroot,verdroten,verdroten
verdrinken,verdronk,verdronken,verdronken
verdwijnen,verdween,verdwenen,verdwenen
vergelijken,vergeleek,vergeleken,vergeleken
vergeten,vergat,vergaten,vergeten
verlaten,verliet,verlieten,verlaten
verliezen,verloor,verloren,verloren
vermijden,vermeed,vermeden,vermeden
verraden,verried,verrieden,verraden
verraden,verraadde,verraadden,verraden
verslinden,verslond,verslonden,verslonden
vertrekken,vertrok,vertrokken,vertrokken
verwijten,verweet,verweten,verweten
verzinnen,verzon,verzonnen,verzonnen
verzwelgen,verzwolg,verzwolgen,verzwolgen
vinden,vond,vonden,gevonden
vlechten,vlocht,vlochten,gevlochten
vliegen,vloog,vlogen,gevlogen
vouwen,vouwde,vouwden,gevouwen
vragen,vroeg,vroegen,gevraagd
vreten,vrat,vraten,gevreten
vriezen,vroor,vroren,gevroren
vriezen,vroor,-,gevroren
vrijen,vree,vreeën,gevreeën
vrijen,vrijde,vrijden,gevrijd
wassen,waste,wasten,gewassen
wassen,wies,wiesen,gewassen
wegen,woog,wogen,gewogen
werpen,wierp,wierpen,geworpen
werven,wierf,wierven,geworven
weten,wist,wisten,geweten
weven,weefde,weefden,geweven
wijken,week,weken,geweken
wijten,weet,weten,geweten
wijzen,wees,wezen,gewezen
willen,wilde,wilden,gewild
willen,wou,wouden,gewild
winden,wond,wonden,gewonden
winnen,won,wonnen,gewonnen
worden,werd,werden,geworden
wreken,wrak,wraken,gewroken
wrijven,wreef,wreven,gewreven
wringen,wrong,wrongen,gewrongen
zeggen,zei,zeiden,gezegd
zenden,zond,zonden,gezonden
zich kwijten van,kweet zich van,kweten zich van,zich gekweten van
zien,zag,zagen,gezien
zijn,was,waren,geweest
zingen,zong,zongen,gezongen
zinken,zonk,zonken,gezonken
zinnen,zon,zonnen,gezonnen
zitten,zat,zaten,gezeten
zoeken,zocht,zochten,gezocht
zouten,zoutte,zoutten,gezouten
zuigen,zoog,zogen,gezogen
zuipen,zoop,zopen,gezopen
zullen,zou,zouden,-
zwelgen,zwolg,zwolgen,gezwolgen
zwellen,zwol,zwollen,gezwollen
zwemmen,zwom,zwommen,gezwommen
zweren,zwoer,zwoeren,gezworen
zwerven,zwierf,zwierven,gezworven
zwijgen,zweeg,zwegen,gezwegen
from filereader import FileReader, CSVReader, TxtReader
from filereader import FileWriter, CSVWriter, TxtWriter
from utils import Utils as ut
import tkinter.filedialog as fd
import os
......@@ -57,12 +56,14 @@ class Controller:
Select a folder from which multiple files can be read.
"""
folder_path = self._view.dir_dialog()
file_names = os.listdir(folder_path)
file_paths = [folder_path + "/" + x for x in file_names]
self._set_path(file_paths, type)
self._view.update_files(file_paths, type)
if file_paths:
self._view.button_status("select {}".format(type), "disabled")
if folder_path:
file_names = os.listdir(folder_path)
file_paths = [folder_path + "/" + x for x in file_names \
if ".csv" in x]
self._set_path(file_paths, type)
self._view.update_files(file_paths, type)
if file_paths:
self._view.button_status("select {}".format(type), "disabled")
# TODO: Call 'buttons' by functionality, not object (type)
def _set_path(self, paths, type):
if type == 'source':
......
from OpenDutchWordnet.wn_grid_parser import Wn_grid_parser
from semantic_checker import SemanticChecker
instance = Wn_grid_parser("OpenDutchWordnet/resources/odwn/odwn_orbn_gwg-LMF_1.3.xml.gz")
instance.load_synonyms_dicts()
sc = SemanticChecker(instance)
#A test case for when the second word is a hypernym of the first
print(sc.semantically_related('hond','carnivoor'))
#A test case for when the first word is a hypernym of the second
print(sc.semantically_related('carnivoor','hond'))
#A test case for when both words are known yet not related.
print(sc.semantically_related('water','hond'))
#A test case for when both words are known and considered synonyms
print(sc.semantically_related('huis','woning'))
#A test case for when the second word is unknown
print(sc.semantically_related('hond','atestword'))
#A test case for when both words are unknown
print(sc.semantically_related('testfirstword','sometestword'))
#A test case for when the first word is unknown
print(sc.semantically_related('xxxxxxx','carnivoor'))
#A test case for when the two words share a hypernym
print(sc.semantically_related('vork','mes'))
#Other test cases to check for other words:
print('And now for the other test cases:')
print(sc.semantically_related('het','de'))
print(sc.semantically_related('een','ander'))
print(sc.semantically_related('woord','zin'))
print(sc.semantically_related('naam','persoon'))
print(sc.semantically_related('MSDT','project'))
print(sc.semantically_related('dog','pet'))
import pandas as pd
from bisect import bisect_left
from utils import Utils as ut
class FormChecker:
def __init__(self):
"""
Constructor
"""
self.initialize_frames()
self._prefixes = ['','ge','be','ver','on','ont']
self._affixes = ['','en','t','te','ten','de','den','s',"'s"]
def initialize_frames(self):
"""
Help the constructor by initializing the frames for irregular verbs.
"""
self._irr_verbs_frame = pd.read_csv(ut.get_path('Irregular verbs.csv'))
self._irr_verbs_vte = self._irr_verbs_frame.copy()
self._irr_verbs_vtm = self._irr_verbs_frame.copy()
self._irr_verbs_vdw = self._irr_verbs_frame.copy()
self._irr_verbs_frame = self._irr_verbs_frame.values
self._irr_verbs_vte = self._irr_verbs_vte.sort_values(
'verleden tijd enkelvoud').values
self._irr_verbs_vtm = self._irr_verbs_vtm.sort_values(
'verleden tijd meervoud').values
self._irr_verbs_vdw = self._irr_verbs_vdw.sort_values(
'voltooid deelwoord').values
def form_related(self, source_word, shadow_word):
"""
Check whether the arguments can be considered to be form-related.
Args:
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the arguments are form-related
"""
return self.fix_related(source_word,shadow_word) or \
self.irr_verb_related(source_word,shadow_word)
def irr_verb_related(self, source_word, shadow_word):
"""
Check whether the arguments are different versions of the same
irregular verb.
Args:
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the arguments are different
versions of the same irregular verb.
"""
if self.irr_verb_helper(self._irr_verbs_frame, 0,
source_word,shadow_word):
return True
elif self.irr_verb_helper(self._irr_verbs_vte,1
, source_word,shadow_word):
return True
elif self.irr_verb_helper(self._irr_verbs_vtm,2
, source_word,shadow_word):
return True
elif self.irr_verb_helper(self._irr_verbs_vdw,3
, source_word,shadow_word):
return True
return False
def irr_verb_helper(self, frame, key, source_word, shadow_word):
"""
Search in one frame to see whether the shadow word and source word are
in the same row.
Args:
frame: A numpy array with String types
key: The column number in which to look
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the source word could be found
and the shadow word is in the same row as the source word.
"""
i = bisect_left(frame[key], source_word)
if i != len(frame[key]) and shadow_word in frame[i]:
return True
return False
def reg_verb_related(self, source_word, shadow_word):
pass
def fix_related(self,source_word,shadow_word):
"""
Check whether the arguments are related in terms of their prefixes and
affixes.
Args:
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the arguments are related in
terms of their prefixes and affixes.
"""
return self.prefix_related(source_word,shadow_word) or \
self.affix_related(source_word,shadow_word)
def prefix_related(self, source_word, shadow_word):
"""
Check whether the arguments are related in terms of their prefixes
Args:
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the arguments are related in
terms of their prefixes.
"""
for pre in self._prefixes:
len_pre = len(pre)
if shadow_word[:len_pre] == pre:
shadow_rest = shadow_word[len_pre:]
for pre2 in self._prefixes:
if pre2 + shadow_rest == source_word:
return True
return False
def affix_related(self, source_word, shadow_word):
"""
Check whether the arguments are related in terms of their prefixes and
postfixes.
Args:
source_word: lemma of type string, corresponding to a source word
shadow_word: lemma of type string, corresponding to a shadow word
Returns:
A boolean value indicating whether the arguments are related in
terms of their prefixes and postfixes.
"""
for aff in self._affixes:
len_aff = len(aff)
if shadow_word[-len_aff:] == aff:
shadow_rest = shadow_word[:-len_aff]
for aff2 in self._affixes:
if shadow_rest + aff2 == source_word:
return True
return False
\ No newline at end of file
from form_checker import FormChecker
import time
former = FormChecker()
print(former.irr_verb_related('bakken', 'bakten'))
print(former.fix_related('hyena', "hyena's"))
print(former.fix_related('hyena',"gehyena"))
print(former.fix_related('gehyena','verhyena'))
print(former.fix_related('hyenaten','hyenaden'))
print(former.fix_related('gehyena','verhyenas'))
......@@ -16,3 +16,4 @@ class Mistake(Enum):
SEMANTIC = "semantic"
SKIPPED = "skipped" # For source words that are not shadowed
RANDOM = "random" # For shadow words that do not reflect a source word
FORM = "form" # For verbs that are shadowed in another form
......@@ -50,7 +50,7 @@ class Model:
def id(self):
return self._id
@id.setter
@id.setter # TODO: DO we still use this? As far as I have seen, we do not. Also, change name of id here.
def id(self, id):
self._id = id
......@@ -70,14 +70,6 @@ class Model:
def data_source(self, data):
self._data_source = data
@property
def multi_data_shadow(self):
return self._multi_data_shadow
@multi_data_shadow.setter
def multi_data_shadow(self, data):
self._multi_data_shadow = data
@property
def multi_data_source(self):
return self._multi_data_source
......@@ -86,18 +78,6 @@ class Model:
def multi_data_source(self, data):
self._multi_data_source = data
@property
def data_shadow(self):
return self._data_shadow
@data_shadow.setter
def data_shadow(self, data):
self._data_shadow = data
@property
def analysis_results(self):
return self._analysis_results
def has_source(self):
"""Check whether self._data_source has a value."""
return self._data_source is not None \
......@@ -112,11 +92,13 @@ class Model:
"""Check whether self._analysis_results has a value."""
return self._analysis_results or self._multi_results
def get_multi_data(self, type):
"""
Get data according to type
def get_multi_data(self, data_type): #TODO: Why do we have this as well when you can also just get multi_data_source itself?
"""Get data according to type
Args:
data_type: the type of data to get (either source or shadow)
"""
if type == "source":
if data_type == "source":
return self._multi_data_source
else:
return self._multi_data_shadow
......
......@@ -9,21 +9,24 @@ class NeedlemanWunsch(AlignmentStrategy):
"""Class that aligns the words of a shadow and source file according
to the Needleman-Wunsch algorithm"""
def __init__(self, seman_checker):
def __init__(self, seman_checker, form_checker):
super().__init__()
self._match = 4
self._mismatch = -2
self._gap_sc = -1
self._seman_match = 2
self._repetition = 0
self._form_match = 2
self._pointers = ['diag', 'up', 'left']
self._source = None
self._shadow = None
self._matrix = None
self._seman_checker = seman_checker
self._form_checker = form_checker
def alignment_options(self, match=None, mismatch=None,
gap_sc=None, seman_match=None, repetition=None):
gap_sc=None, seman_match=None, repetition=None,
form_match=None):
""" Set the scores that are allocated whilst aligning. Can be changed
one at a time or more at once.
......@@ -46,6 +49,8 @@ class NeedlemanWunsch(AlignmentStrategy):
self._seman_match = seman_match
if repetition:
self._repetition = repetition
if form_match:
self._form_match = form_match
def align(self, source, shadow):
""" This is the main function of finding alignments.
......@@ -66,7 +71,6 @@ class NeedlemanWunsch(AlignmentStrategy):
self._fill_matrix()
alignment_source, alignment_shadow = self._traceback()
return self._source, self._shadow
# return alignment_source, alignment_shadow
def _initialize_matrix(self):
""" Initialize matrix according to the Needleman-Wunsch algorithm.
......@@ -95,6 +99,9 @@ class NeedlemanWunsch(AlignmentStrategy):
for j in range(1, n+1):
if self._source[j - 1] == self._shadow[i - 1]:
value = self._match
elif self._form_checker.form_related(self._source[j-1].word,
self._shadow[i-1].word):
value = self._form_match
elif self._seman_checker.semantically_related(
self._source[j-1].word, self._shadow[i-1].word):
value = self._seman_match
......@@ -155,14 +162,16 @@ class NeedlemanWunsch(AlignmentStrategy):
return Sentence(alignment_source), Sentence(alignment_shadow)
def _check_repetition(self, index):
""" Check whether a word is repeated or not
""" Check whether a word is repeated or not.
Args:
index: the index of the word to check if it is a repeat
index: The index of the word to check
"""
# TODO: check for form mistakes first
word = self._shadow[index]
return index > 0 and word == self._shadow[index-1] or \
index < len(self._shadow) - 1 and word == self._shadow[index + 1]
return index > 0 and self._shadow[index - 1].word.endswith(word.word) \
or index < len(self._shadow) - 1 and \
self._shadow[index + 1].word.startswith(word.word)
def _equals_checker(self, source, shadow):
""" Check whether two words are syntactically or semantically equal
......@@ -176,8 +185,13 @@ class NeedlemanWunsch(AlignmentStrategy):
source.shadowed = True
shadow.correct = True
shadow.source = source
elif self._seman_checker.semantically_related(source.word,shadow.word):
elif self._seman_checker.semantically_related(source.word,
shadow.word):
source.shadowed = True
source.mistake = Mistake.SEMANTIC
shadow.mistake = Mistake.SEMANTIC
elif self._form_checker.form_related(source.word, shadow.word):
source.shadowed = True
source.mistake = Mistake.FORM
shadow.mistake = Mistake.FORM
return source, shadow
umbra/resources/logo.ico

198 KiB

umbra/resources/splash.png

18.4 KiB

......@@ -3,6 +3,7 @@ from needleman_wunsch import NeedlemanWunsch
from anchor_algorithm import AnchorAlgorithm
from mistake_finder import MistakeFinder
from semantic_checker import SemanticChecker
from form_checker import FormChecker
from utils import Utils as ut
import time
......@@ -18,10 +19,10 @@ class Statistics:
# currently the case, so the two operate seperately in this class.
# _parser and _seman_checker should be moved to MistakeFinder when
# possible
self.path = "OpenDutchWordnet/resources/odwn/odwn_orbn_gwg-LMF_1.3.xml.gz"
# "./umbra/OpenDutchWordnet/resources/odwn/odwn_orbn_gwg-LMF_1.3.xml.gz") # Ubuntu path, temporary 'fix'
self.path = ut.get_path("OpenDutchWordnet/resources/odwn/odwn_orbn_gwg-LMF_1.3.xml.gz")
self._seman_checker = SemanticChecker()
self._form_checker = FormChecker()
self._mistake_finder = MistakeFinder(self._seman_checker)
@property
......@@ -50,7 +51,8 @@ class Statistics:
print('\n Needleman-Wunsch')
results = 'Needleman-Wunsch'
discrete_start_time = time.time()
self._strategy = NeedlemanWunsch(self._seman_checker)
self._strategy = NeedlemanWunsch(self._seman_checker,
self._form_checker)
source_align, shadow_align = self._strategy.align(source, shadow)
for s_word in shadow_align:
if s_word.has_source():
......
......@@ -7,8 +7,8 @@ class Umbra:
"""Initialise seperate components of program."""
def __init__(self):
self._model = Model()
self._view = View()
self._model = Model()
self._controller = Controller(self._view, self._model)
def main(self):
......
......@@ -87,3 +87,4 @@ class Utils:
cnt += 1
key += "({})".format(str(cnt))
dict[key] = value
pass
......@@ -4,18 +4,28 @@ from tkinter import ttk, W, filedialog # tk.ttk yields an AttributeError
from functools import partial
from utils import Utils as ut
import tkinter.filedialog as fd
from PIL import ImageTk, Image
class View:
"""Handle GUI and I/O elements of the program."""
def __init__(self):
self._window = tk.Tk()
# Center window
self._center_window()
# Draw splash
self._splash = SplashView(self._window)
# Create rest of GUI
self._window.wm_title("Umbra")
self._frame = tk.Frame(self._window).grid(column=0, row=0)
self._elements = {} # Dict to avoid large number of attributes
self._selected_source = "No file selected"
self._selected_shadow = "No file selected"
# self._options = Options(self)
#self._options = Options(self)
# Options are not redundant quite yet
self._actionlistener = None
......@@ -44,6 +54,9 @@ class View:
self._create_label('message', self._frame, "", 5, 1)
self._spit = False
# Window Icon
self._window.iconbitmap("./resources/logo.ico")
@property
def spit(self):
return self._spit
......@@ -54,6 +67,8 @@ class View:
def display(self):
"""Start main loop, displaying GUI elements."""
#self._splash.terminate()
self._window.deiconify()
self._window.mainloop()
def select_files(self, file_type):
......@@ -98,12 +113,14 @@ class View:
if paths == []:
filebox.set("No file selected")
filebox['values'] = []
filebox['state'] = "disabled"
else:
filenames = []
for path in paths:
filenames.append(path.title().split("/")[-1])
filebox['values'] = filenames
filebox.set(filenames[-1])
filebox['state'] = "read_only"
# Easier to just update both than to do a type check AGAIN
self._selected_source = self._elements['file source'].get()
......@@ -172,6 +189,16 @@ class View:
### Element creation & placement # TODO: Unify arguments (especially positional)
def _center_window(self):
self._window.update_idletasks()
self._pos_right = int(self._window.winfo_screenwidth() / 2
- self._window.winfo_reqwidth())
self._pos_down = int(self._window.winfo_screenheight() / 2
- self._window.winfo_reqheight())
self._window.geometry("+{}+{}".format(self._pos_right, self._pos_down))
self._window.update()
self._window.withdraw()
def _menu_bar(self, key="menu"): # we only need the one, so...
pass
......@@ -198,20 +225,21 @@ class View:
type,
2, column)
self._create_button('select {}'.format(type),
frame,
'Select {} file'.format(type),
5, column)
frame,
'Add {} file'.format(type),
5, column)
self._create_button('delete {}'.format(type),
frame,
'Delete {}'.format(type),
7, column)
frame,
'Remove {}'.format(type),
7, column)
self._create_button('rm_all {}'.format(type),
frame,
'Delete all {} files'.format(type),
8, column)
self._create_button('select_folder {}'.format(type), frame,
'Select {} folder'.format(type),
6, column)
frame,
'Remove all {} files'.format(type),
8, column)
self._create_button('select_folder {}'.format(type),
frame,
'Add {} folder'.format(type),
6, column)
def _create_button(self, key, frame, text, row, column):
"""Create button and place it in the given frame.
......@@ -247,7 +275,7 @@ class View:
ValueError: Key already exists
"""
filebox = ttk.Combobox(frame,
state="readonly",
state="disabled",
width=20)
filebox.set("No file selected")
......@@ -349,3 +377,32 @@ class Options(View):
action_function = partial(self._view._perform_action, key=command)
tab.add_command(label=label)
tab.bind('<Button>', action_function)
class SplashView(tk.Toplevel):
"""A splash screen while the rest of the application is loading. """
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.grab_set()
self.title("Umbra")
self.iconbitmap(ut.get_path("resources/logo.ico"))
im_path = Image.open(ut.get_path("resources/splash.png"))
ph = ImageTk.PhotoImage(im_path)
load_img = tk.Label(self, image=ph)
load_img.grid(row=0, column=0)
# Center window and remove window border
# TODO: Currently this block is mostly a duplicate of _center_window
self.update_idletasks()
self._pos_right = int(self.winfo_screenwidth() / 2
- self.winfo_reqwidth() + 150)
self._pos_down = int(self.winfo_screenheight() / 2
- self.winfo_reqheight())
self.geometry("+{}+{}".format(self._pos_right, self._pos_down))
self.overrideredirect(True) # TODO: This currently breaks on Ubuntu
self.update()
def terminate(self):
self.destroy()