我无法导入和使用我创建的模块。我有patcher.py,我想从patches.py导入模块,但是在尝试导入和使用disable_removecd时出现错误。我现在对如何正确设置以及如何正确导入和使用它感到困惑。
patcher.py
#import the tkinter module
from tkinter import *
from tkinter.filedialog import askopenfilename
import bsdiff4
from patches import *
#bsdiff4.file_patch(dst, dst, patch)
#create a new class
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
self.grid(row = 2, sticky = W+E+N+S)
#,padx=300
cmexecutable = askopenfilename()
print(cmexecutable)
self.mainmenu()
def mainmenu(self):
self.logo = PhotoImage(file='logo.gif')
self.image = Label(self, image=self.logo)
self.image.grid(columnspan = 2)
self.image.configure(background='black')
#self.bttn1 = Button(self, text = 'Country Specific')
self.bttn1 = Button(self, text = 'Disable Remove CD Message')
self.bttn1['command'] = disable_removecd(self)
self.bttn1.grid(columnspan = 2 ,sticky = W+E+N+S)
patches.py
from patcher import *
def disable_removecd():
offset1 = 0x42a98b
offset2 = 0x42a98c
offset3 = 0x42a98d
offset4 = 0x42a98e
offset5 = 0x42a98f
offset6 = 0x42e400
offset7 = 0x42e401
offset8 = 0x42e402
offset9 = 0x42e403
offset10 = 0x42e404
newvalue1 = b'\x90'
newvalue2 = b'\x90'
newvalue3 = b'\x90'
newvalue4 = b'\x90'
newvalue5 = b'\x90'
newvalue6 = b'\x90'
newvalue7 = b'\x90'
newvalue8 = b'\x90'
newvalue9 = b'\x90'
newvalue10 = b'\x90'
with open(cmexecutable, 'r+b') as victim:
victim.seek(offset1)
victim.write(newvalue1)
victim.seek(offset2)
victim.write(newvalue2)
victim.seek(offset3)
victim.write(newvalue3)
victim.seek(offset4)
victim.write(newvalue4)
victim.seek(offset5)
victim.write(newvalue5)
victim.seek(offset6)
victim.write(newvalue6)
victim.seek(offset7)
victim.write(newvalue7)
victim.seek(offset8)
victim.write(newvalue8)
victim.seek(offset9)
victim.write(newvalue9)
victim.seek(offset10)
victim.write(newvalue10)
当我运行patcher.py时出现此错误:
self.bttn1['command'] = disable_removecd(self)
NameError: name 'disable_removecd' is not defined
我做错了什么?
答案 0 :(得分:0)
patches.py
中的以下行导致循环导入。
from patcher import *
我认为您使用该行在cmexecutable
函数中使用disable_removecd
。删除上面的行。并明确传递cmexecutable
的值。
patcher.py :
...
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
self.grid(row=2, sticky=W+E+N+S)
cmexecutable = askopenfilename()
self.mainmenu(cmexecutable)
def mainmenu(self, cmexecutable):
self.logo = PhotoImage(file='logo.gif')
self.image = Label(self, image=self.logo)
self.image.grid(columnspan=2)
self.image.configure(background='black')
self.bttn1 = Button(self, text = 'Disable Remove CD Message')
self.bttn1['command'] = lambda: disable_removecd(cmexecutable)
# ^^ set up callback instead of calling it immediately using `lambda`.
self.bttn1.grid(columnspan=2 ,sticky=W+E+N+S)
应修改disable_removecd
中的patches.py
函数以接受cmexecutable
作为参数:
def disable_removecd(cmexecutable):
....