2014-11-22 3 views
0

У меня возникли проблемы с импортом и использованием модуля, который я создал. У меня есть patcher.py, и я хотел бы импортировать модули из patches.py, но я получаю сообщение об ошибке при попытке импортировать и использовать disable_removecd. Теперь я немного запутался в том, как правильно настроить его и как правильно импортировать и использовать.Python3 - импортирующий и использующий модуль tkinter

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

Следующая строка в 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): 
    .... 
+0

я сделать эти изменения, но когда я нажимаю на bttn1 Я получаю: 'Файл" cmpatcherv002.py ", строка 37, в self.bttn1 ['c ommand '] = lambda: disable_removecd (cmexecutable) ТипError: disable_removecd() принимает 0 позиционных аргументов, но 1 дано ' –

+0

@ Хосе, я забыл упомянуть, что' disable_removecd' также должен быть изменен. Я обновил ответ, чтобы включить его. – falsetru

+0

Кажется теперь работать. Я изменил 'def disable_removecd (self):' и с 'open (self, 'r + b') в качестве жертвы:' Это правильно? Также должен ли я использовать 'self.offset1'? –

Смежные вопросы