📄 textstat.pyw
字号:
#!/usr/bin/python# -*- coding: iso-8859-1 -*-import os, cPickle, StringIO, sys, webbrowserfrom Tkinter import *import tkMessageBox, tkFileDialogimport StatusBar, ToolBar, ProgressBarimport TabPage, MultiListBoximport Korpus, LangOpttry: from win32com.client import Dispatchexcept: pass####################### Konfigurieren...# SkriptDir = os.path.dirname(os.path.abspath(__file__))# Dies scheint besser zu funktionieren:SkriptDir = os.path.dirname(sys.argv[0])ImgDir = os.path.join(SkriptDir, 'Images')cfgFile = os.path.join(SkriptDir, 'TextSTAT.ini')try: f = open(cfgFile) cfg = cPickle.load(f) f.close()except: cfg = {} cfg['Benutzersprache'] = 'en' # Optionen: de | nl | en | pt | fr | gl cfg['KorpDir'] = SkriptDir cfg['FileDir'] = SkriptDir cfg['freqMin'] = '0' cfg['freqMax'] = '0' cfg['konkContextL'] = '40' cfg['konkContextR'] = '40' cfg['zitContextL'] = '350' cfg['zitContextR'] = '350' cfg['FileKodierung'] = 'iso8859_1' # wird momentan negiert... cfg['fenster'] = '700x580+10+10' # d.i.: Breite x H鰄e + xOffset + yOffset# Spracheif cfg['Benutzersprache'] == 'en': s = LangOpt.englishelif cfg['Benutzersprache'] == 'nl': s = LangOpt.nederlandselif cfg['Benutzersprache'] == 'pt': s = LangOpt.portugueseelif cfg['Benutzersprache'] == 'fr': s = LangOpt.francaiselif cfg['Benutzersprache'] == 'gl': s = LangOpt.galicianelse: s = LangOpt.deutsch################ GUIroot = Tk()root.title(s['Titel_lang'])root.geometry(cfg['fenster'])root.minsize(650, 550) # (Breite, H鰄e)root.option_add('*Text*background', 'white')root.option_add('*Listbox*background', 'white')if os.name == 'nt': ico = os.path.join(SkriptDir, 'Images/TextSTAT.ico') root.iconbitmap(bitmap=ico) root.option_add('*Font', 'Verdana 8') root.option_add('*Listbox*font', (('Courier', 'New'), '9')) root.option_add('*Text*font', 'Verdana 10')else: root.option_add('*Font', 'Arial 9 bold') root.option_add('*Listbox*font', 'Monospace 11') root.option_add('*Text*font', 'Arial 11')class GUI: def __init__(self, root): self.root = root self.korpus = None try: self.LetzteKorpusFiles=[] self.LetzteKorpusFiles.append(cfg['LetzteKorpusFiles0']) self.LetzteKorpusFiles.append(cfg['LetzteKorpusFiles1']) self.LetzteKorpusFiles.append(cfg['LetzteKorpusFiles2']) self.LetzteKorpusFiles.append(cfg['LetzteKorpusFiles3']) except: pass # Wenn Fenster 黚er Windows-Fenstermanager geschlossen wird... self.root.protocol( 'WM_DELETE_WINDOW', self.ende ) self.fenster = Frame(self.root) self.fenster.pack(expand=YES, fill=BOTH ) # Das Menu MeinMenu = Menu(self.root) self.root.config(menu=MeinMenu) self.filemenu = Menu(MeinMenu, tearoff=0) MeinMenu.add_cascade(label=s['Korpus'], underline=0, menu = self.filemenu) self.filemenu.add_command(label=s['KorpusNew'], underline=0, command = self.korpus_new) self.filemenu.add_command(label=s['KorpusOpen'], underline=0, command = self.korpus_open) self.filemenu.add_command(label=s['KorpusHinzu'], underline=1, command = self.korpus_hinzu) self.filemenu.add_command(label=s['KorpusSave'], underline=2, command = self.korpus_save) self.filemenu.add_command(label=s['KorpusSaveAs'], underline=3, command = self.korpus_save_as) self.filemenu.add_command(label=s['KorpusDel'], underline=4, command = self.korpus_del) self.recentfilesmenu = Menu(self.filemenu, tearoff=0) self.filemenu.add_cascade(label=s['LetzteKorpora'], underline=0, state=DISABLED, menu=self.recentfilesmenu) self.update_recentfiles_menu() self.filemenu.add_separator() self.filemenu.add_command(label=s['DateiHinzu'], underline=0, command = self.datei_hinzu) self.filemenu.add_command(label=s['WebHinzu'], underline=0, command = self.WebDialog) self.filemenu.add_command(label=s['NewsHinzu'], underline=0, command = self.NewsDialog) self.filemenu.add_separator() self.filemenu.add_command(label=s['DateiWeg'], underline=2, command = self.datei_entfernen) self.filemenu.add_separator() self.filemenu.add_command(label=s['OptSave'], underline=0, command = self.optionen_speichern) self.filemenu.add_command(label=s['Exit'], underline=1, command = self.ende) exportmenu = Menu(MeinMenu, tearoff=0) MeinMenu.add_cascade(label=s['ImpEx'], underline=0, menu = exportmenu) exportmenu.add_command(label=s['Ex2csv'], underline=0, command = self.export2csv) exportmenu.add_command(label=s['Ex2txt'], underline=0, command = self.export2txt) exportmenu.add_separator() exportmenu.add_command(label=s['Ex2excel'], underline=1, command = self.export2excel) exportmenu.add_command(label=s['Ex2word'], underline=1, command = self.export2word) # exportmenu.add_separator() # exportmenu.add_command(label=s['ImpKorpus'], underline=7, command = self.korpus_import) sprachmenu = Menu(MeinMenu, tearoff=0) MeinMenu.add_cascade(label=s['Sprache'], underline=0, menu = sprachmenu) self.sprache_aendern = StringVar() self.sprache_aendern.set(cfg['Benutzersprache']) oberflaechensprachen = [ ['Deutsch', 'de'], ['English', 'en'], ['Nederlands', 'nl'], ['Portugu阺', 'pt'], ['Fran鏰is', 'fr'], ['Galego', 'gl'], ] for sprach_label, sprach_abkz in oberflaechensprachen: sprachmenu.add_radiobutton(label=sprach_label, underline=0, variable=self.sprache_aendern, value=sprach_abkz, command=self.sprachwarnung) codepagemenu = Menu(MeinMenu, tearoff=1) MeinMenu.add_cascade(label=s['CodePage'], underline=1, menu = codepagemenu) self.dateiart = StringVar() self.dateiart.set(cfg['FileKodierung']) # self.dateiart.set('iso8859-1') kodierungen = [ ['UTF-8 (Unicode)', 'utf_8'], ['UTF-16 (Unicode)', 'utf_16'], ['ISO-8859-1 (Latin-1)', 'iso8859_1'], ['ISO-8859-2 (Latin-2)', 'iso8859_2'], ['ISO-8859-5 (Cyrillic)', 'iso8859_5'], ['ISO-8859-6 (Arabic)', 'iso8859_6'], ['ISO-8859-7 (Greek)', 'iso8859_7'], ['ISO-8859-8 (Hebrew)', 'iso8859_8'], ['CP1252 (ANSI, WinLatin-1)', 'cp1252'], ['CP1250 (WinLatin-2)', 'cp1250'], ['CP1251 (WinCyrillic)', 'cp1251'], ['CP1254 (WinTurkish)', 'cp1254'], ['CP1255 (WinHebrew)', 'cp1255'], ['CP1256 (WinArabic)', 'cp1256'], ['CP850 (MS DOS)', 'cp850'], ['KOI 8 R (Russian)', 'koi8_r'], ['GB 2312 (Simplified Chinese)', 'gb2312'], ['BIG 5 (Traditional Chinese)', 'big5'], ] for bezeichnung, kodierung in kodierungen: codepagemenu.add_radiobutton(label=bezeichnung, variable=self.dateiart, value=kodierung) # Hilfe- / Info-Menu hilfemenu = Menu(MeinMenu, tearoff=0) MeinMenu.add_cascade(label=s['Hilfe'], underline=1, menu = hilfemenu) hilfemenu.add_command(label=s['RegExpHelp'], underline=0, command = self.regex_hilfe) hilfemenu.add_separator() hilfemenu.add_command(label=s['History'], underline=0, command = self.zeigHistory) hilfemenu.add_command(label=s['License'], underline=0, command = self.zeigLicense) hilfemenu.add_separator() hilfemenu.add_command(label=s['Info'], underline=0, command = self.about) # Die Statuszeile self.status = StatusBar.StatusBar(self.root, ProgressBar=1) self.status.pack(fill=X) self.status.set(s['Willkommen']) self.status.indicator(s['StatusNoKorp']) # Der Toolbar # Die Icons stammen von http://www.trash.net/~ffischer/admin/icons/ # self.toolbar = ToolBar.ToolBar(self.fenster, statusbar = self.status) self.toolbar.pack(side=TOP, fill=X) self.toolbar.add('NeuButton', s['KorpusNew'], ImgDir+'/New.gif', self.korpus_new, s['KorpusNew2']) self.toolbar.add('KorpusOeffnenButton', s['KorpusOpen'], ImgDir+'/Open.gif', self.korpus_open, s['KorpusOpen2']) self.toolbar.add('KorpusHinzuButton', s['KorpusHinzu'], ImgDir+'/FolderIn.gif', self.korpus_hinzu, s['KorpusHinzu2']) self.toolbar.add('SaveButton', s['KorpusSave'], ImgDir+'/Save.gif', self.korpus_save, s['KorpusSave2']) self.toolbar.add('WegButton', s['KorpusDel'], ImgDir+'/Delete.gif', self.korpus_del, s['KorpusDel2']) self.toolbar.add_separator() self.toolbar.add('HTMLhinzuButton', s['WebHinzu'], ImgDir+'/DataStoreGrey.gif', self.WebDialog, s['WebHinzu2'] ) self.toolbar.add('HinzuButton', s['DateiHinzu'], ImgDir+'/DataStore.gif', self.datei_hinzu, s['DateiHinzu2'] ) self.toolbar.add('EntfernButton', s['DateiWeg'], ImgDir+'/DataExtract.gif', self.datei_entfernen, s['DateiWeg2']) self.toolbar.add_separator() self.toolbar.add('FrequenzButton', s['FreqZeigen'], ImgDir+'/Column.gif', self.zeigWortfrequenz, s['FreqZeigen2']) self.toolbar.add_separator() self.toolbar.add('CopyButton', s['Kopieren'], ImgDir+'/Copy.gif', self.copy2clipboard, s['Kopieren2']) self.toolbar.add_separator() # self.toolbar.add('ExcelButton', s['Ex2excel'], ImgDir+'/NewSheet.gif', self.export2excel, s['Ex2excel2']) # self.toolbar.add('WordButton', s['Ex2word'], ImgDir+'/DocumentDraw.gif', self.export2word, s['Ex2word2']) # self.toolbar.add_separator() self.toolbar.add('HelpButton', s['Info'], ImgDir+'/Help.gif', self.about, s['Info2']) # Die Arbeitsflaeche self.tabPages = TabPage.TabPageSet( self.fenster, pageNames=[ s['KorpusTab'], s['FormenTab'], s['ConcTab'], s['ZitatTab'] ] ) self.tabPages.pack( expand=TRUE,fill=BOTH ) self.machKorpusTab() self.machFormenTab() self.machKonkordanzTab() self.machZitatTab() self.tabPages.pages[s['KorpusTab']]['page'].lift() # Beim ersten Start: Sprache festlegen if not os.path.exists(cfgFile): self.info('TextSTAT language', 'Welcome to TextSTAT! \n\nYou can change the language of TextSTAT (Menu > Language) \nAvailable Languages are: English, German, Dutch, French, Potuguese, Galician') self.optionen_speichern() def machKorpusTab(self): frame=self.tabPages.pages[s['KorpusTab']]['page'] self.infotxt = StringVar() self.infolabel = Label(frame, wraplength=200, justify=LEFT, textvariable=self.infotxt) self.infolabel.pack(side=RIGHT, padx=10, pady=10) listframe = Frame(frame) listframe.pack(expand=YES, fill=BOTH, side=LEFT, padx=5, pady=5) vscrollbar = Scrollbar(listframe, orient=VERTICAL) hscrollbar = Scrollbar(listframe, orient=HORIZONTAL) self.datliste = Listbox(listframe, selectmode=EXTENDED, borderwidth=1, yscrollcommand=vscrollbar.set, xscrollcommand=hscrollbar.set) vscrollbar.config(command=self.datliste.yview) hscrollbar.config(command=self.datliste.xview) vscrollbar.pack(side=RIGHT, fill=Y, padx=0) hscrollbar.pack(side=BOTTOM, fill=X, pady=0) self.datliste.pack(side=LEFT, expand=YES, fill=BOTH, padx=0) self.datliste.bind('<Enter>', self.statusAktualisieren) self.datliste.bind('<Button-3>', self.KorpusTabPopup) self.datliste.bind('<Double-Button-1>', self.datei_oeffnen) self.infotxt.set(s['KTinfo']) def KorpusTabPopup(self, event): self.KorpusPopupMenu = Menu(self.root, tearoff=0) self.KorpusPopupMenu.add_command(label=s['KTkopieren'], command=self.copy2clipboard) self.KorpusPopupMenu.add_command(label=s['KTopen'], command=self.datei_oeffnen) self.KorpusPopupMenu.add_command(label=s['KTdatinfo'], command=self.datei_info) self.KorpusPopupMenu.add_command(label=s['KTdatweg'], command=self.datei_entfernen) self.KorpusPopupMenu.tk_popup(*self.root.winfo_pointerxy()) def machFormenTab(self): frame=self.tabPages.pages[s['FormenTab']]['page'] listframe = Frame(frame) listframe.pack(side=LEFT, expand=YES, fill=BOTH, padx=5, pady=5) self.freqliste = MultiListBox.MultiListbox(listframe, ((s['FTwortform'], 55), (s['FTfrequenz'], 5)), command=self.zeigKonkordanz, borderwidth=1, height=20) self.freqliste.pack(side=LEFT, fill=BOTH, expand=YES) for l in self.freqliste.lists: l.bind('<Enter>', self.statusAktualisieren) l.bind('<Button-3>', self.FormenTabPopup) optFrame = LabelFrame(frame, text=s['FTOptionen']) optFrame.pack(fill=X, padx=5, pady=5) # Label(optFrame, text=s['FTinfo'], justify=LEFT).pack(anchor=W) optFrame1 = Frame(optFrame) optFrame1.pack(fill=BOTH, pady=10) self.sortModusFreq = StringVar() Radiobutton(optFrame1, text=s['FTsortFreq'], value='freq', variable=self.sortModusFreq).pack(anchor=W) Radiobutton(optFrame1, text=s['FTsortAlpha'], value='alpha', variable=self.sortModusFreq).pack(anchor=W) Radiobutton(optFrame1, text=s['FTsortRetro'], value='retro', variable=self.sortModusFreq).pack(anchor=W) self.sortModusFreq.set('freq') optFrame2 = Frame(optFrame) optFrame2.pack(fill=X, padx=5) self.minFreq = StringVar() self.minFreq.set(cfg['freqMin']) Spinbox(optFrame2, width=5, textvariable=self.minFreq, values=('---',1,2,3,4,5,10,25,50,100,250,500,750,1000,2500,5000,10000)).pack(side=LEFT, anchor=W) Label(optFrame2, text=s['FTminFreq']).pack(side=LEFT, padx=5) optFrame3 = Frame(optFrame)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -