我在将一个类实例中定义的变量传递到另一个类实例时遇到问题。我对使用类比较陌生,但据我所知,变量可以通过简单地定义为类实例的一部分(例如在下面的示例中)从一个实例传递到另一个实例。虽然我以前使用过这个模型,但我从未尝试过使用像wxPython这样的GUI框架来实现这一点。class Foo(object):

def __init__(self, var):

self.var = var

class Bar(object):

def do_something(self, var):

print var*3

if __name__ == '__main__':

f = Foo(3)

b = Bar()

b.do_something(f.var)

我遇到的问题是wxPython实例似乎是预定义的,不接受任何附加参数(允许我只向类实例传递标题、大小等内容)。

我面临的另一个问题是,我试图通过调用一个对话框窗口来深入传递变量三个类,并从对话框中调用一个单独的类来启动一个工作线程。

所以我的问题是:如何将变量从一级实例传递到三级实例?

如何重写wxPython实例以允许定义其他变量?

或者,是否可以创建自定义事件处理程序来传递必要的数据?

澄清。。。

我正在使用Python,我想我理解使用类和带有Tkinter和wxPython(在这个项目中使用)框架的GUI编程的基本原理。我已经编写了一个从用户那里获取一些数据的主类/实例,我希望能够传递self.main_instance_var中存储的信息,并将其传递给第二个类/实例(在本例中,是从第一个类调用的进度对话框窗口)。

当我试图在进度对话框中使用上述模型时,出现了一个非常不格式化的语法错误(“关键字arg之后是非关键字arg”)。阻止我进一步将变量从“进度”对话框窗口传递到工作线程。如果我得到一个异常,那将是一件事,但语法错误我不明白。下面是一个简短的例子:class ProgressDialog(wx.Dialog):

def __init__(self, parent, title, myVar): # Generates syntax error on this line

super(ProgressDialog, self).__init__(parent=parent,

title=title, size=(500, 110))

self.var = myVar

基本来源(按要求,很抱歉这么脏):import time

import os, sys, wx

from ftplib import FTP_TLS

from threading import Thread

from wx.lib.pubsub import Publisher

########################################################################

class FtpValues(object):

""" Returns a property attribute - called by FtpFileTransfer

Used to set values/variables for Host, USERID, PASSWD, FILE """

#----------------------------------------------------------------------

def __init__(self):

self.varList = None

#----------------------------------------------------------------------

def GetValues(self):

return self.varList

#----------------------------------------------------------------------

def SetValues(self, HOST, USERID, PASSWD, FILE):

self.varList = [HOST, USERID, PASSWD, FILE]

#----------------------------------------------------------------------

def DelValues(self):

del self.valList

Values = property(GetValues, SetValues, DelValues, "Set/Get FtpValues")

# http://docs.python.org/library/functions.html#property

########################################################################

class FtpFileTransfer(Thread):

"""Test Worker Thread Class."""

#----------------------------------------------------------------------

def __init__(self):

"""Init Worker Thread Class."""

Thread.__init__(self)

self.StartTransfer() # start the thread

#----------------------------------------------------------------------

def StartTransfer(self): # was named run - started automatically

"""Run Worker Thread.""" # when called by the start method

# This is the code executing in the new thread.

HOST, USERID, PASSWD, FILE = FtpValues.Values

BLOCKSIZE = 57344

try:

ftp = FTP_TLS(HOST)

ftp.login(USERID, PASSWD)

ftp.prot_p()

ftp.voidcmd("TYPE I")

f = open(FILE, 'rb')

datasock, esize = ftp.ntransfercmd(

'STOR %s' % os.path.basename(FILE))

size = os.stat(FILE)[6]

bytes_so_far = 0

while 1:

buf = f.read(BLOCKSIZE)

if not buf:

break

datasock.sendall(buf)

bytes_so_far += len(buf)

msg = [bytes_so_far, size]

Publisher().sendMessage("update", msg)

except: raise

finally:

try:

datasock.close()

f.close()

ftp.voidresp()

ftp.quit()

print 'Complete...'

except: pass

wx.CallAfter(Publisher().sendMessage, "update", "Database Transfer Complete!")

########################################################################

class ProgressDialog(wx.Dialog):

def __init__(self, parent, title):

super(ProgressDialog, self).__init__(parent=parent,

title=title, size=(500, 110))

self.displayLbl = wx.StaticText(self, -1, 'Verifying Database Files... ', (20, 20)) #Preparing for Transfer...

self.gauge = wx.Gauge(self, -1, 100, (20, 45), (370, 24))

self.btn = btn = wx.Button(self, -1, 'Cancel', (400, 45), (-1, 25))

btn.Bind(wx.EVT_BUTTON, self.OnClose)

# listens for response from worker thread

Publisher().subscribe(self.updateDisplay, "update")

FtpFileTransfer()#.StartTransfer(HOST, USERID, PASSWD, FILE) #Start the FTP Worker Thread

#self.OnStart()

#----------------------------------------------------------------------

def run(self):

FtpFileTransfer(HOST, USERID, PASSWD, FILE)

#----------------------------------------------------------------------

def OnClose(self, event):

""" Place Holder """

if self.btn.GetLabel() == 'Finish':

# Do Something!

pass

return None

#----------------------------------------------------------------------

def updateDisplay(self, msg):

""" Receives data from thread and updates the display """

if isinstance(msg.data, list):

bytes_so_far, size = msg.data

k = 100 * bytes_so_far / size

self.displayLbl.SetLabel("Sent %d of %d bytes %.1f%%" % (bytes_so_far, size, 100 * bytes_so_far / size))

self.gauge.SetValue(k)

else:

self.displayLbl.SetLabel("%s" % msg.data)

#self.btn.Enable()

self.btn.SetLabel('Finish')

########################################################################

class MyForm(wx.Frame):

#----------------------------------------------------------------------

def __init__(self):

wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

# Add a panel so it looks the correct on all platforms

panel = wx.Panel(self, wx.ID_ANY)

self.displayLbl = wx.StaticText(panel, label="Amount of time since thread started goes here")

self.btn = btn = wx.Button(panel, label="Start Thread")

self.gauge = wx.Gauge(panel, -1, 100, size=(370, 24))

btn.Bind(wx.EVT_BUTTON, self.onButton)

sizer = wx.BoxSizer(wx.VERTICAL)

sizer.Add(self.displayLbl, 0, wx.ALL|wx.CENTER, 5)

sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)

sizer.Add(self.gauge, 0, wx.ALL|wx.CENTER, 5)

panel.SetSizer(sizer)

self.VarData()

# create a pubsub receiver

Publisher().subscribe(self.updateDisplay, "update")

#----------------------------------------------------------------------

def onButton(self, event):

"""

Runs the thread

"""

chgdep = ProgressDialog(None, title='File Transfer. . .')

chgdep.ShowModal()

#chgdep.Destroy()

#----------------------------------------------------------------------

def updateDisplay(self, msg):

"""

Receives data from thread and updates the display

"""

if isinstance(msg.data, list):

bytes_so_far, size = msg.data

k = 100 * bytes_so_far / size

self.displayLbl.SetLabel("Sent %d of %d bytes %.1f%%" % (bytes_so_far, size, 100 * bytes_so_far / size))

self.gauge.SetValue(k)

else:

self.displayLbl.SetLabel("%s" % msg.data)

self.btn.Enable()

#----------------------------------------------------------------------

def VarData(self):

HOST = '127.0.0.1'

USERID = 'test'

PASSWD = 'P@ssw0rd'

FILE = r'F:\Programming\temp\Test.zip'

varList = [HOST, USERID, PASSWD, FILE]

FtpValues.Values = HOST, USERID, PASSWD, FILE

#----------------------------------------------------------------------

# Run the program

if __name__ == "__main__":

app = wx.PySimpleApp()

frame = MyForm().Show()

app.MainLoop()

python传递类的实例_使用Python将变量从一个类实例传递到另一个类实例?相关推荐

  1. python类高级用法_十.python面向对象高级用法

    1.反射 1.1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的 ...

  2. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  3. python tkinter计算器实例_使用Python自带GUI tkinter编写一个期权价格计算器

    0 准备工作 首先,确认环境中有numpy.scipy.stats和tkinter三个功能包.前两个功能包可用于Python的数学计算,比如使用numpy来生成随机数用于Monte Carlo模拟,以 ...

  4. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  5. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  6. 用python绘制树和森林_使用Python的Turtle库绘制森林的实例

    这是由一个小作业引发的对Python的Turtle库的学习 下面是官方手册: 1.配置编程环境 由于现在的笔记本是临时借的,编程环境不是熟悉的环境,又由于种种原因没有安装成功Anaconda,就尝试了 ...

  7. python随机生成一组数据_使用Python random模块生成随机数据实例

    在本节中,我们将学习如何使用random模块(random)在Python中生成随机数和数据.该模块为各种分布(包括整数,浮点数(实数))实现了伪随机数生成器. 本文的目标: 以下是我们将在本文中介绍 ...

  8. python类的参数_在Python中使用类中的参数

    当我在Codecademy上学习 Python时,我遇到了这个问题,代码如下: class Employee(object): def __init__(self, name): self.name ...

  9. python 外部参数过长_介绍python中slice参数过长的处理方法及实例

    python教程栏目介绍slice参数过长的处理方法 很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step .start .stop .因为参数的值也是多变的,所以我们 ...

最新文章

  1. 什么是SAP FR?
  2. 使用qwt作曲线图——有网格线背景的画法
  3. java 中的 super
  4. OpenCV3.2+VS2013+Tesseract3.02.02配置
  5. Oracle 10R2 研究--db_file_multiblock_read_count对成本的影响
  6. [BC Round#26] Card 【各种水】
  7. NOI数据结构:最小树形图
  8. C/C++:mongoose.c实现多表单域文件上传
  9. A way to visualize mip levels
  10. OpenSSF 获1000万美元投资,提升开源软件和软件供应链安全
  11. Android App开机自启动
  12. 湖南省大学生程序设计竞赛系统设计
  13. PCB板的绘制原来是这样完成的——布线
  14. 利用Python绘制一朵太阳花
  15. 硬盘详解与如何选购固态硬盘
  16. 科学计算机算e的连续复利,自然对数e的证明和货币基金连续复利的真相
  17. 定点 浮点 神经网络 量化_神经网络模型量化论文小结
  18. (android)向sdcard中添加文件出现Failed to push the item(s)
  19. '/',‘\\’与‘\’的区别
  20. 计算机桌面没有cd驱动器,电脑没有光盘驱动器怎么解决?

热门文章

  1. Python3.x中的三目运算实现方法
  2. Spring 自带的一些工具类
  3. 分布式存储系统可靠性如何估算?
  4. CentOS6.8下安装xz命令
  5. IOS 获取系统通讯录中的联系人信息
  6. DataGridView默认不选中
  7. Codeforces Round #243 (Div. 1)
  8. python的gzip库使用方法
  9. println()函数输出int类型返回值错误的问题
  10. 跟闺密逛街 越逛越穷