2017-07-28 5 views
1

Ich erstelle ein Tkinter-Programm, das dem Benutzer erlaubt, Text in eine hübsch aussehende Box statt in die Python-Shell einzugeben.Variable von einer anderen Datei holen - python

Da ich diese in mehreren Programmen verwenden möchte, habe ich eine Funktion erstellt, die in anderen Dateien verwendet werden kann.

Ich kann es in einer anderen Datei ausführen, aber nicht importieren, die Variable hier ist mein Code.

Datei 1:

import tkinter as tk 

def input_text(label_text, button_text): 
    class SampleApp(tk.Tk): 

     def __init__(self): 
      tk.Tk.__init__(self) 
      self.entry = tk.Entry(self) 
      self.button = tk.Button(self, text=button_text, command=self.on_button) 
      self.label = tk.Label(self, text=label_text) 
      self.label.pack(side = 'top', pady = 5) 
      self.button.pack(side = 'bottom', pady = 5) 
      self.entry.pack() 


     def on_button(self): 
      answer = self.entry.get() 
      self.destroy() 


    w = SampleApp() 
    w.resizable(width=True, height=True) 
    w.geometry('{}x{}'.format(180, 90)) 
    w.mainloop() 

File 2:

import text_input as ti 
from text_input import answer 
ti.input_text('Enter some text', 'OK') 

ich den Fehler ImportError: cannot import name 'answer'

+0

Sie ‚Antwort‘ nicht überall sein scheinen zu speichern, so dass es außerhalb der Funktion nicht 'on_button' existieren. Ich denke, es gibt wahrscheinlich einen besseren Weg, dies zu tun - zum Beispiel die Klasse und den Kontrollcode nicht in der gleichen Funktion zu haben. –

+0

Es gibt keine "Antwort" in der Datei 1 –

+0

Ja, es ist in der letzten Funktion (am unteren Rand) – Daniel

Antwort

1

answer is a local variable within Taste . If you want to import` es, Sie brauchen es Attribut, ein Paket zu machen:

import tkinter as tk 

global answer 

def input_text(label_text, button_text): 
    class SampleApp(tk.Tk): 
    ... 

     def on_button(self): 
      global answer 
      answer = self.entry.get() 

Dies ist jedoch eine sehr seltsame Möglichkeit, auf die Daten zuzugreifen. Sauberes Moduldesign würde wahrscheinlich das Objekt (SampleApp) zur Hand haben und die Antwort mit einem Methodenaufruf für diese App extrahieren. Einfacher, warum nicht einfach diesen Wert von on_button zurückgeben?

def on_button(self): 
     answer = self.entry.get() 
     self.destroy() 
     return answer 

... so würde Ihre Nutzung

response = my_app.on_button() 
Verwandte Themen