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()
好的,这就是我想要做的。要温柔,不要笑,我是个新人。
答案 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.py
和fileB.py
并且包含类ClassA
和ClassB
,那么您可以访问ClassB
从fileA.py
像这样:
import fileB
instanceB = fileB.ClassB()