使用python类作为要启动的对象

时间:2014-11-27 01:34:51

标签: python class

OOP和Python的新手,以及一个很老的屁,非常适合c中的程序编码。

无论如何,我创建了一个有效的Python类; 它会显示一个窗口,其中包含一些用户选项。 我从网上复制了一个脚本(一个Hello World脚本)并学习了如何修改它来做我想做的事情。

当用户选择第一个选项中的特定选项时,我想创建另一个与第一个(克隆)类似的类,以获得第二级选项。

它应该建立另一个带有这组选择的窗口。 我改变了我认为应该与第一个不同的各种名字。

所以,我的问题是如何将第二个类用作对象并且"调用"如果用户在第一个类中进行了适当的选择,它将从第一个开始。

我在第一个类中包含了第二个类的import语句,但是当用户做出应该调用第二个类的选择时,我不知道应该在代码中插入什么。

添加代码示例(适当编辑但可能不够):

第一档:

import Tkinter as tk
import sys
import Example_Edit
from PIL import Image, ImageTk
from Tkinter import Tk, Label, BOTH
from ttk import Frame, Style

class Main_Loader(tk.Frame):

    def __init__(self, master):
        # Initialize window using the parent's constructor
        tk.Frame.__init__(self,
                          master,
                          width=400,
                          height=300)
        # Set the title
        self.master.title('Main Data Loader')

        # This allows the size specification to take effect
        self.pack_propagate(0)

        # We'll use the flexible pack layout manager
        self.pack()

        # The option selector
        # Use a StringVar to access the selector's value
        self.option_var = tk.StringVar()
        self.option = tk.OptionMenu(self,
                                      self.option_var,
                                      '(Select a Workflow)',
                                      'EDIT Project Data',
                                      'Load SEGY data to IDS',
                                      'Preview a SEGY line',
                                      'Move SEGY file to DBFS'
                                      )
        self.option_var.set('(Select a Workflow)')

#more code to complete the frame



    def do_something(self):

        Edit = Example_Edit.Main_Edit

        if self.option_var.get() == '(Select a Workflow)':
            print('Select a Workflow')
        elif self.option_var.get() == 'EDIT Project Data':
            print('Do--%s' % (self.option_var.get()))
            Edit(self)    :'<===============what goes here===================='
        elif self.option_var.get() == 'Move SEGY file to DBFS':
            print('Do--%s' % (self.option_var.get()))
        elif self.option_var.get() == 'Preview a SEGY line':
            print('Do--%s' % (self.option_var.get()))
        elif self.option_var.get() == 'Load SEGY data to IDS':
            print('Do--%s' % (self.option_var.get()))

    def end_it(self):
        quit() 

    def run(self):
        ''' Run the app '''
        self.mainloop()

app = Main_Loader(tk.Tk())
app.run()

第二档:

import Tkinter as tk
import sys
from PIL import Image, ImageTk
from Tkinter import Tk, Label, BOTH
from ttk import Frame, Style

class Main_Edit(tk.Frame):

    def __init__(self, master):

        # Initialize window using the parent's constructor

        tk.Frame.__init__(self,
                          master,
                          width=400,
                          height=300)
        # Set the title
        self.master.title('Main Netadata Editor')



#more code here to complete the frame


    def do_something(self):

#       do stuff

    def end_it(self):
        quit() 

好的,这就是我想要做的。要温柔,不要笑,我是个新人。

3 个答案:

答案 0 :(得分:0)

我认为你要找的是第一堂课的子类。

类似的东西:

class myClass():
    def __init__(self,value,text):
        self.value = value
        self.text = text

    def show_values(self):
        print self.value,self.text

class myCloneClass(myClass):
    def show_values(self):
        print "Value:",self.value
        print "Text:",self.text

a = myClass(1,'Hello')
b = myCloneClass(2,'World')
a.show_values()
b.show_values()

输出:

1 Hello
Value: 2
Text: World
  

我想创建另一个与第一个(克隆)

非常相似的类

myClass有一个方法可以打印它的值,但格式不正确, myCloneClass具有相同名称的相同方法,以更好的方式打印其值


  

如何将第二个类用作对象并且&#34;调用&#34;它来自第一个   如果用户在第一个类中进行了适当的选择

或许您正在寻找另一个类对象中的类对象

类似的东西:

class myFirstClass():
    def __init__(self):
        self.color = raw_input("What is favorite color? ")
        print "Your favorite color is",self.color
        if self.color == 'blue':
            self.sub_instance = mySecondClass()

class mySecondClass():
    def __init__(self):
        self.food = raw_input("What is favorite food? ")
        print "Your favorite food is", self.food

a = myFirstClass()

&#39;一个&#39;是myFirstClass的一个实例,如果用户选择了&#39; blue&#39;作为它最喜欢的颜色,它创建了一个名为self.sub_instance的新名称,它是mySecondClass的一个实例。我不知道为什么你会想要这样的东西,因为你可以用第一堂课来存储新的价值。这是处理事情的一种相当麻烦的方式。

要访问您需要使用的最喜欢的食物:

a.sub_instance.food # outside the myFirstClass
self.sub_instance.food # inside the myFirstClass

但如果喜欢的颜色不是蓝色,那么它就会失败。首先,因为它会创建新的名称(self.sub_instance),引发一个AttributeError。

答案 1 :(得分:0)

做出另一个答案,以避免混淆。

这一行:

Edit = Example_Edit.Main_Edit

应该是

Edit = Example_Edit.Main_Edit(self)

在这里,您创建了一个名为Edit的名称,它是Main_Edit类的一个实例,它位于Example_Edit文件中,因为Main_Edit接受一个参数,一个类实例(您称之为master),将它们全部传递( &#39; self&#39;)。

下一步:

Edit(self)  '<===============what goes here===================='

您可以替换它并开始使用Edit方法[来自Main_Edit类]。

只需这样做:

elif self.option_var.get() == 'EDIT Project Data':
    Edit.do_something()
elif self.option_var.get() == 'end':
    Edit.end_it()

编辑:

顺便说一下:

在你的main_edit类

这一行:

self.master.title('Main Netadata Editor')

应该是:

self.master.master.title('Main Netadata Editor')

因为主类Main_Loader也使用了主名称。

这就是为什么我在另一个答案中说过在类实例中使用类实例很麻烦。

答案 2 :(得分:-1)

没有.py的其他文件的文件名,然后是句点,然后是类的名称。

因此,例如,如果您的文件分别被调用fileA.pyfileB.py并且包含类ClassAClassB,那么您可以访问ClassBfileA.py像这样:

import fileB

instanceB = fileB.ClassB()