Fokus nach Save-Dialog nicht mehr auf FontLab-Fenster

Fragen zu Tkinter.
Antworten
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

Ich habe ein FontLab-Makro (FontLab ist ein Font-Editor) mit Save-File-Dialog geschrieben. Nachdem das Dialog-Fenster wieder geschlossen wurde, liegt der Fokus aber nicht mehr auf dem FontLab-Fenster. Das könnte den Benutzer irritieren, insbesondere wenn mehrere Fonts geöffnet sind. Wie lenke ich also den Fokus wieder auf FontLab?

Ich habe mich übrigens vor ein paar Tagen zum ersten Mal mit Python befasst. Ich wäre also besonders dankbar für nicht zu kryptische oder bis zur Unverständlichkeit gekürzte Antworten.

Code: Alles auswählen

#FLM: Save namFile

def buildNamFile():
	import Tkinter,tkFileDialog
	root = Tkinter.Tk()
	root.withdraw()
	namFileName = tkFileDialog.asksaveasfilename(parent=root, initialfile=fontName+'.nam', initialdir="/", title="Save namFile as ...")
	if not namFileName == '':
		namFile = open(namFileName, 'w')
		print >> namFile, '%%FONTLAB NAMETABLE: '+fontName
		for g in fl.font.glyphs:
			a = g.unicode
			if a:
				a = hex(a)
				while len(a) <= 5:
					a = '0x0'+a[2:]
				print >> namFile, a, g.name
		counter=0
		for g in fl.font.glyphs:
			a = g.unicode
			if not a:
				counter += 1
				a = '%0x????'
				if counter == 1:
					print >> namFile, '%--------------------------------------------------unencoded'
				print >> namFile, a, g.name
		namFile.close()

if fl.font != None:
	if fl.font.glyphs:
		if fl.font.font_name == None:
			fontName = 'Untitled'
		else:
			fontName = fl.font.font_name
		buildNamFile()
	else:
		print 'Error: Font does not contain glyphs.'
else:
	print 'Error: No font opened.'
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Wenn FontLab ein Tkinter.Widget - oder davon abgeleitet ist, ist dein Schlüsselwort die Methode ".focus_set()"
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Achso generelle Infos

Aus:

Code: Alles auswählen

handle = open(...)
mach bitte

Code: Alles auswählen

with open(...) as handle:
Dann aus:

Code: Alles auswählen

print >> handle, "something"
dies:

Code: Alles auswählen

handle.write("something")
Und das Tkinter.Tk(), bitte nur einmal bei deinem Hauptfenster setzen sonst bitte Tkinter.Toplevel nutzen

Edit:
und imports nicht in eine Funktion setzen sondern immer am Anfang der Datei.

Edit 2:
auf None bitte immer mit is Prüfen, also aus

Code: Alles auswählen

if fl.font != None:
mach:

Code: Alles auswählen

if fl.font is not None:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

@ Xynon1

:wink: Danke, aber genau solche Antworten sind derzeit noch viel zu kryptisch für mich! Würdest du deine Antwort verstehen, wenn du gerade erst angefangen hättest, dich mit Python zu beschäftigen? Ursprünglich wollte ich nur ein kleines Problem in FontLab lösen und das ging nur mit Python. Als ich das Makro geschrieben habe, wusste ich nur zu 20%, was ich tue. Ich habe einfach herumprobiert. Ich kenne mich also auch mit der Terminologie nicht aus und noch fehlt mir völlig die Orientierung im Python-Dschungel. Aber Python fängt an, mich über mein ursprüngliches Problem, das ich längst gelöst habe, hinaus zu interessieren. Rein vorbeugend: Dass ich mir weniger kryptische Antworten wünsche, hat nichts mit einer fehlenden Bereitschaft zu tun, mir selbst Informationen zusammenzusuchen. Das habe ich in den letzten Tagen schon gemacht. Ich beabsichtige auch, mir ein Buch über Python zu kaufen, um mir etwas Basis-Wissen über Python anzueignen. Jedenfalls habe ich mir angewöhnt, mich in die Lage meines unwissenden Gegenübers zu versetzen, wenn ich ihm etwas erklären will, das mir schon in Fleisch und Blut übergegangen ist.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Also erledigt ?

Und ja, würde ich zwar nicht die Gründe verstehen aber das was ich ändern sollt, denn kryptisch ist das nun nicht gerade, sieh dir mal meine Beschreibung genau an.
Das sind alles nur Stellen, wo du deinen Text einfach anders schreiben solltest.
Das ändert ja nichst an der Strucktur sondern nur an der Form deines Textes.

Hier ich habe mal die von mir Beschriebenen Änderungen eingesetzt:

Code: Alles auswählen

#FLM: Save namFile
import Tkinter
import tkFileDialog

def buildNamFile():
   root = Tkinter.Toplevel()
   root.withdraw()
   namFileName = tkFileDialog.asksaveasfilename(parent=root, initialfile=fontName+'.nam', initialdir="/", title="Save namFile as ...")
   if namFileName != '':
      with open(namFileName, 'w') as namFile:
         namFile.write('%%FONTLAB NAMETABLE: '+fontName)
         for g in fl.font.glyphs:
            a = g.unicode
            if a:
               a = hex(a)
               while len(a) <= 5:
                  a = '0x0'+a[2:]
               namFile.write(a + " " + g.name)
         counter=0
         for g in fl.font.glyphs:
            a = g.unicode
            if not a:
               counter += 1
               a = '%0x????'
               if counter == 1:
                  namFile.write('%--------------------------------------------------unencoded')
               namFile.write(a + " " + g.name)

if fl.font is not None:
   if fl.font.glyphs:
      if fl.font.font_name is None:
         fontName = 'Untitled'
      else:
         fontName = fl.font.font_name
      buildNamFile()
   else:
      print 'Error: Font does not contain glyphs.'
else:
   print 'Error: No font opened.'
Wobei mir gerade auffällt das du immer 3 leerzeichen nutzt, besser wären 4.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

@ Xynon1

Danke nochmal. Dass du mir mit deiner Antwort helfen wolltest, hatte ich schon gesehen.
Also erledigt ?
Das ursprüngliche Problem meinte ich, also die Möglichkeit, mit FontLab die Datei zu generieren. Aber das Problem mit dem Fokus, der nicht mehr auf dem FontLab-Fenster liegt, habe ich immer noch. »Widget« hört sich übrigens so an, als werde FontLab von dem Script gestartet. Aber das Makro wird in FontLab gestartet.

Ich bekomme übrigens folgende Fehlermeldung mit deinem Code:

Code: Alles auswählen

  File "<string>", line 10
    with open(namFileName, 'w') as namFile:
            ^
SyntaxError: invalid syntax
Allerdings läuft FontLab nur mit Python 2.3. Kann es daran liegen?

In Bezug auf die drei Leerzeichen: Eigentlich verwende ich den Tabulator. Wenn ich einen Beitrag erstelle und ein Tab einkopiere, ist er im Editier-Fenster vorhanden, wird aber in drei Leerzeichen umgewandelt, wenn ich den Beitrag absende.
auf None bitte immer mit is Prüfen
Vermutlich, weil »==« für Vergleiche von Zahlen vorgesehen ist. Das hatte ich sogar zuerst.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

kyou hat geschrieben:Allerdings läuft FontLab nur mit Python 2.3. Kann es daran liegen?
Ja with geht erst ab 2.5 wenn ich mich richtig erinnere, in diesem Fall solltest du

Code: Alles auswählen

try:
    handle = open(...)
finally:
    handle.close()
nehmen.

"is" überprüft die Objekt ID, welche bei None immer gleich ist.
"==" dient dazu um Werte zu prüfen, also nicht nur Zahlen.

Dein Problem mit dem Fenster ist dann aber nicht Tkinter bezogen, wenn FontLab(tut mir leid kenn ich eigentlich nicht) ein externes Programm ist.
Dein Problem mit dem Fokus ist dann also Systemabhängig.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Xynon1 hat geschrieben:Ja with geht erst ab 2.5 wenn ich mich richtig erinnere,
<klugscheiß>Ab 2.6 oder aber mit __future__-import ab 2.5</klugscheiß>
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

Ich hab mal Screenshots gemacht, um die Sache mit dem Fokus zu illustrieren:

Vor Start des Makros
Bild

Makro gestartet
Bild

Makro beendet
Bild
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

FontLab wird hier nicht so verwendet, vielleicht wirst du im FontLab Forum fündig. Oder hier gibt es ein Skript das meiner Meinung nach etwas ähnliches macht wie deines:
http://typophile.com/node/75834
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

Oder hier gibt es ein Skript das meiner Meinung nach etwas ähnliches macht wie deines
Ja, weil das meine ersten Versionen sind. :D Ich könnte es natürlich auch mal auf dem FontLab-Forum versuchen, aber die Beteiligung auf dem FontLab-Forum ist das Gegenteil von rege. Zum Teil liegt das daran, dass die Mehrheit der Typedesigner sich nicht fürs Programmieren interessiert oder nicht das Talent dafür hat. Viele haben schon Schwierigkeiten, ihre OpenType-Layout-Features zu programmieren oder ihre Fonts intern richtig zu benennen und das ist meiner Meinung nach beides viel einfacher als Python.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das liegt am Betriebsystem, wie es mit den Fenstern um geht.

Versuch doch nochmal mit einem Toplevel Widget und nicht mit einen Tk Fenster das ganze, vieleicht wird das anders gehandelt. Ansonsten müsstest du, wenn ich das richtig sehe auf die Windows API zugreifen und dort das Fenster fokusieren.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
kyou
User
Beiträge: 50
Registriert: Sonntag 7. November 2010, 08:38

Überraschenderweise habe ich dieses Mal auf dem FontLab-Forum ziemlich schnell eine Antwort bekommen. Die Lösung scheint in Sicht:

http://forum.fontlab.com/python-scripti ... 749.0.html

Für heute mache ich aber Schluss. Danke euch für die Tipps, auch wenn sie mir in Bezug auf das eigentliche Problem nur bedingt geholfen haben. Zumindest kann ich den Code jetzt etwas säubern.

Hier ist übrigens die »Unofficial FontLab/Python API Reference« zu finden: http://www.e-font.de/flpydoc/view_html.html
Antworten