2016-05-04 8 views
1
importieren

Ich habe das Gefühl, dass dies in einem facepalm enden wird, aber ich kann nur nicht herausfinden, warum dieses import x from y Szenario für mich nicht funktioniert. Als Ausgangspunkt nehmen Sie das folgende Modul main.py:Kann Tkinter Font-Objekt nicht von Modul

import Tkinter as tk 
import tkFont 
__metaclass__ = type 
#Create widgets 
root = tk.Tk() 
fntPlainText = tkFont.Font(family='Courier New',size=10) 
lblDisplay = tk.Label(root, relief=tk.SUNKEN, 
         font=fntPlainText, 
         width=30,height=5, 
         text='This is a test!') 
#Do layout 
lblDisplay.grid(padx=5,pady=5) 
#Begin app 
tk.mainloop() 

Dies läuft normal und legt ein kleines Label mit dem erwarteten Inhalt auf:

enter image description here

So, jetzt möchte ich die Definition von bewegen Diese Font Objekt zu einem separaten Modul, so kann ich es unter mehreren Anwendungen teilen. Meine aktualisierten Code-Module sind fonts1.py:

import Tkinter as tk 
import tkFont 
__metaclass__ = type 
fntPlainText = tkFont.Font(family='Courier New',size=10) 

... und main1.py:

import Tkinter as tk 
from fonts1 import fntPlainText 
__metaclass__ = type 

#Create widgets 
root = tk.Tk() 
lblDisplay = tk.Label(root, relief=tk.SUNKEN, 
         font=fntPlainText, 
         width=30,height=5, 
         text='This is a test!') 
#Do layout 
lblDisplay.grid(padx=5,pady=5) 
#Begin app 
tk.mainloop() 

Aber wenn ich main1.py laufen, erhalte ich eine Zurückverfolgungs:

Traceback (most recent call last): 
    File "G:\Python\experiments\investigations\tk\main1.py", line 2, in <module> 
    from fonts1 import fntPlainText 
    File "G:\Python\experiments\investigations\tk\fonts1.py", line 5, in <module> 
    fntPlainText = tkFont.Font(family='Courier New',size=10) 
    File "C:\Python27\lib\lib-tk\tkFont.py", line 89, in __init__ 
    tk.call("font", "create", self.name, *font) 
AttributeError: 'NoneType' object has no attribute 'call' 

Von googeln und Experimentieren, Ich habe genug gefunden, um zu wissen, dass etwas mit der Zuweisung von fntPlainText schief läuft, aber (wieder) kann ich nicht herausfinden, was es ist. Das größte Puzzle der ganzen Situation ist, dass, wenn ich fonts1.py einfach abspecken zu fntPlainText als

Modified fonts1.py tuple-- zu definieren:

fntPlainText = ('Courier New',10) 

Laufe main1.py jetzt abgeschlossen normal und malt das gleiche Fenster wie main.py.

Wenn es darauf ankommt, ist die Umgebung Python 2.7.x unter Windows 7.

+1

Es klingt wie Sie versuchen, die Schriftart vor dem Erstellen des Stammfensters zu erstellen. –

+0

Ja, das ist es. Kommentar unten zu Matt erklärt, was mich abgeworfen hat. – JDM

Antwort

2

Sie benötigen einen Root-Fenster (tk.Tk()) zu erstellen, bevor die Schrift zu schaffen. Wenn Sie Ihre

unter den Aufruf tk.Tk() verschieben, sollte es wie erwartet funktionieren.

+0

ja, das funktioniert. Und jetzt denke ich, dass ich sehe, warum ich die Rückverfolgung für dieses Szenario bekomme, wo ich keine Rückverfolgung für andere ähnliche Szenarien bekam. In meiner "echten" Anwendung habe ich mehrere externe Module, die verschiedene benutzerdefinierte Tkinter-Widgets definieren, aber in allen Fällen sind diese Widgets als Klassendefinition eingepackt ... daher importieren sie einfach gut, weil das Widget tatsächlich nicht existiert es ist instanziiert (was in meiner "echten" Anwendung erst lange nach der Erstellung des Root-Fensters passiert). – JDM

+0

Wenn 'fonts1' enthalten' def make_plain_font (root): return tkFont.Font (root, family = 'Courier New', size = 10) ', dann würde der Import die Schrift nicht erstellen und Sie könnten den Import wieder an den Anfang setzen wo es hingehört.. –