我很难将变量从一个函数传递到另一个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:必须使用TestGUI实例作为第一个参数调用未绑定方法writetoBOT()(改为使用str实例)
答案 0 :(得分:4)
writetoBOT
有两个参数:self
和instruct
。
使用Testgui
实例调用它:
tgui=Testgui(your_master)
tgui.writetoBOT(l)
如果您想使用Testgui
课程进行调用,则仍需要传递Testgui
的实例:
tgui=Testgui(your_master)
Testgui.writetoBOT(tgui, l)
答案 1 :(得分: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)
答案 2 :(得分:0)
您将Testgui
声明为一个类。这应理解为骨架或线框(注意,这是一个捷径,而不是现实)。您需要首先从此骨架中创建一个“真实”对象才能使用它。
testgui=Testgui(amaster)
在类中可以使用在类级别应用的方法(绑定函数)。这些被称为静态方法或类方法。它们必须用python进行装饰。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Object_oriented_programming。