2014-01-31 4 views
0

Мне трудно передать переменную от одной функции к другой функции в другом скрипте python. Я прочитал другие ответы, но они по-настоящему не помогли в этом вопросе.Передача переменной другому скрипту Python

Это первый файл, я хочу послать переменную (часть кода опущена для ясности)

# TestGUI.py 

from Tkinter import * 
import serial 
import os 

class Testgui: 
    def __init__(self, master): 

    def writetoBOT(self,instruct): 
     ser = serial.Serial(6) 
     ser.baudrate = 9600 
     ser.parity = serial.PARITY_NONE #set parity check: no parity 
     ser.timeout = 1   #non-block read 
     ser.writeTimeout = 2  #timeout for writ 

     if(ser.isOpen() == False): 
      ser.open() 
      print ser.portstr  # check which port was really used 
      ser.write(instruct) 
     else : 
      ser.write(instruct) 

Это sceond файл:

# TestGUI_2.py 

from TestGUI import Testgui 

class Tracker: 
    def __init__(self): 
     pass 
    def drive(self,cords, cords1): 
     while(cords >= 320):   
      l='l' 
      Testgui.writetoBOT(l)  # This is the problem line 

TypeError: несвязанный метод writetoBOT() должен быть вызван с экземпляром TestGUI в качестве первого аргумента (вместо этого был получен экземпляр str)

+0

У вас есть 2 файла, но вы пытаетесь выполнить скрипт * one *, верно? ваше описание довольно запутанно. –

ответ

4

writetoBOT принимает 2 аргумента: self и instruct. называют его с Testgui например:

tgui=Testgui(your_master) 
tgui.writetoBOT(l) 

Если вы хотите назвать это с Testgui класса, вам все равно нужно передать экземпляр Testgui:

tgui=Testgui(your_master) 
Testgui.writetoBOT(tgui, l) 
+0

Является ли (ваш_мастер) вызывающим классом? в этом случае Tracker()? –

+0

@ user3257360 Это аргумент, который необходимо передать при создании экземпляра Testgui. См. 'Def __init __ (self, master)'. Разве вы не написали этот код? – zhangxaochen

+0

Чтобы исправить мой код, я сделал еще один класс с именем writetoSerial() и поместил в него серийный код записи. Затем импортируется функция, затем вызывается с помощью: из TestGUI_2 import writetoSerial, после чего называется функцией: l = 'l' t = writetoSerial() t.writetoBOT (l) –

0

В качестве альтернативы, вы можете сделать общее пространство для это два сценария, он АКС по базе данных - sqllite

Например,

# file1.py 
import sqlite3 

con = sqlite3.connect('messages.db') 
cur = con.cursor() 
#cur.execute('CREATE TABLE message (id INTEGER PRIMARY KEY, name TEXT, content TEXT, read INTEGER)') 
#con.commit() 


for x in range(100000): 
    if x in range(1, 500): 
     cur.execute('INSERT INTO message (id, name, content, read) VALUES(NULL, "Guido", "van Rossum", 0)') 
     con.commit() 

# file2.py 
import sqlite3 
import time 

con = sqlite3.connect('messages.db') 
cur = con.cursor() 

def listen(): 
    messages = cur.execute('SELECT * FROM message WHERE read=0') 
    if not messages: 
     return False 
    for m in messages: 
     print 'get message ', m 
     cur.execute("UPDATE message SET read=1 WHERE id=?", m[0])   
     con.commit() 
     print 'update db' 
    return True 

while True: 
    listen() 
    time.sleep(5) 
0

Вы объявили Testgui как класс. Это следует понимать как скелет или каркас (будьте осторожны, это ярлык, а не реальность). Вы должны сначала создать «настоящий» объект из этого скелета, чтобы использовать его.

testgui=Testgui(amaster) 

В классах можно использовать методы (связанные функции), которые применяются на уровне класса. Они называются статическими методами или методами класса. Их нужно украсить на питоне.

Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Object_oriented_programming.

Смежные вопросы