2014-02-25 163 views
0

我一直在試圖運行這個簡單的測試只是爲了得到如何從另一個腳本導入方法的感覺,但我有兩個問題:導入錯誤蟒蛇的Tkinter

  1. 整個程序運行,而不是隻需導入和調用方法,當我需要它們時。

  2. 我得到這個錯誤:

    Traceback (most recent call last): 
        File "C:\Users\devilboy 4\Documents\Visual Studio 2013\Projects\classvariablesOnANewScript\classvariablesOnANewScript\classvariablesOnANewScript.py", line 1, in <module> 
    from logInScreen import getUser, getPass 
    

    導入錯誤:無法導入名稱的getUser

這是我導入到腳本:

from logInScreen import getUser, getPass 
class hello: 

    def show(self): 
     usr = getUser() 
     ps = getPass() 
     str(usr) 
     str(ps) 

h = hello() 
h.show() 

這是什麼在logInScreen.py:

from tkinter import * 
import os 
import tkinter.messagebox 

#check si lo entrado es correcto 
class checkValidation: 
    fail = 0 
    user = "hi user" 
    password = "nice pass" 

    #valida el user y el pass 
    def fullVali(self, name, passwd): 
     if name == "" or name == " ": 
      tkinter.messagebox.showinfo("Error","Dejo el usuario en blanco") 
      self.fail+= 1 
     elif name != "UmetSeg":   
      tkinter.messagebox.showinfo("Error","Usuario incorrecto") 
      self.fail+= 1   
     else : 
      self.user = name   
      tkinter.messagebox.showinfo("ok","dude" + name) 

     if passwd == "" or passwd == " ": 
      tkinter.messagebox.showinfo("Error","Dejo la password en blanco") 
      self.fail+= 1 
     elif passwd != "SegUmet":    
      tkinter.messagebox.showinfo("Error","Password incorrecto") 
      self.fail+= 1    
     else: 
      self.password = passwd   
      tkinter.messagebox.showinfo("ok","dude" + passwd) 
      form.destroy() 

     #open another py script  
      #os.system("mainPage3.py 1") 
      return 

# no deja pasar parametros por command en el boton a menos que se por lambda, so corre  #este metodo para 
#correr el metodo de validar 
    def callVali(self): 
     user = usrIn.get() 
     self.fullVali(usrIn.get(), passIn.get()) 
     return 

    def getUser(self): 
     return self.user 

    def getPass(self): 
     return self.password 



vali = checkValidation() 
form = Tk() 
form.title("LogIn") 
form.geometry("300x320+300+200") 

#User txtBox 
usrIn = Entry(form, textvariable = None, width = 30) 
usrIn.place(x = 60, y = 140) 
user = usrIn.get() 
#Passwd txtBox 
passIn = Entry(form, textvariable = None, width = 30) 
passIn.place(x = 60, y = 200) 
#Username Label 
usrLblVal = StringVar() 
usrLblVal.set("User name") 
usrLbl = Label(form, textvariable = usrLblVal ) 
usrLbl.place(x = 120, y = 115) 

#Passwrd label 
passLblVal = StringVar() 
passLblVal.set("Password") 
passLbl = Label(form, textvariable = passLblVal ) 
passLbl.place(x = 120, y = 175) 


#Login btn 
btn = Button(form, text = "Entrar", width = 10, command = vali.callVali) 
btn.place(x = 110, y = 250) 

form.mainloop() 

我希望我得到了縮進的權利,有點痛苦經歷每一行和間隔4次,直到它是正確的。我爲西班牙語道歉,只是忽略所有評論大聲笑

+0

你知道你可以突出顯示所有的代碼,然後點擊看起來像'{}'按鈕?它會自動爲你添加四個空格。 –

回答

3

您正試圖從您的LogInScreen.py文件中的class中導入方法。該方法getUsergetPassbound methods屬於類checkValidation,你需要自行導入class,讓你的類,而不是

from LogInScreen import checkValidation 

validation = checkValidation() 
validation.getUser() 
validation.getPass() 

通話作爲一個簡單的例子考慮下面的例子涉及兩個文件:

file_to_import_from.py(類似於你logInScreen.py

class MyClass: 
    def my_class_bound_method(self): 
     print "hello I a method belonging to MyClass" 

def my_method_not_belonging_to_a_class(): 
    print "Hello, I am a method that does not belong to a class" 

file_to_import_to.py(A nalogous到腳本要導入到)

from file_to_import_from import my_method_not_belonging_to_a_class 

my_method_not_belonging_to_a_class() 


from file_to_import_from import MyClass 

x = MyClass() 
x.my_class_bound_method() 

from file_to_import_from import my_class_bound_method 

my_class_bound_method() 

而看到輸出

Hello, I am a method that does not belong to a class 
hello I a method belonging to MyClass 

Traceback (most recent call last): 
    File "C:\Users\Joe\Desktop\Python\import_test2.py", line 10, in <module> 
    from file_to_import_from import my_class_bound_method 
ImportError: cannot import name my_class_bound_method 

正如你可以看到,前兩個電話中的工作,但這個錯誤你正面臨着站起身,第二次,這是因爲方法my_class_bound_method作爲MyClass類中的方法存在。

編輯

在回答您的意見,以避免運行整個文件,環繞在你的「LogInScreen.py」的代碼在if聲明,如果該文件被解釋評估,檢查是正在運行main文件。

from tkinter import * 
import os 
import tkinter.messagebox 

#check si lo entrado es correcto 
class checkValidation: 
    # CODE FROM YOUR CLASS OMITTED FOR BREVITY SAKE 

# NOTHING BEYOUND THIS IF STATEMENT WILL RUN WHEN THE FILE IS IMPORTED 
if __name__ == "__main__": 
    vali = checkValidation() 
    # MORE CODE OMITTED FOR BREVITY 
    form.mainloop() 

if聲明我這裏補充檢查一個特殊的環境變量,python時將創建解釋一個文件,這是__name__,文件的時候,你是直接運行該文件:python file_i_am_running.py變量__name__設置的字符串"__main__"表示它是主要的方法,當它不是正在運行的文件,並且可能會導入一個與您的情況相同的變量時,變量將設置爲module名稱,即file_to_import

+0

固定一個,但是當我導入整個程序運行的類。就像窗戶打開並放置一切。我不想運行該程序。我是否應該將所有按鈕,條目和標籤放在方法上,並可能修復它? – Jcorretjer

+1

@ chelo666這是由於'python'執行導入的性質。實質上,當您導入整個文件時,您正在詢問python運行該文件。這個解決方案可以通過我編輯時的註解來修復。 –

+0

不錯,我明白了。謝謝。 – Jcorretjer

0

改成這樣:

from logInScreen import checkValidation 

,然後使用:

check = checkValidation() 
usr = check.getUser() 
ps = check.getPass() 
+0

你的例子是錯誤的。你創建一個叫做check的實例,然後調用val.getUser()。你應該調用'check.getuser()'。 –

+0

謝謝,我回答得很快。 –

+0

我更喜歡使用相同的變量,而不是多使用一個。感謝您的建議 – Jcorretjer