Python3 - tkinter导入和使用模块

时间:2014-11-22 17:48:25

标签: python python-3.x tkinter python-import python-module

我无法导入和使用我创建的模块。我有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

我做错了什么?

1 个答案:

答案 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):
    ....