ImportError:无法导入名称myVar

时间:2014-11-30 01:51:21

标签: python python-2.7

我正在使用python日历前端来执行倒计时的python脚本。我可以从前端的变量打印到终端的字符串,它是我想要使用的格式,即:

(12/10/14  12:00:00, %m/%d/%y %H:%M:%S)

我遇到的麻烦是当我替换(ccDateTime)时(12/10/14) 在倒计时脚本中。

在倒计时脚本中我尝试了

from frontEnd import ccDateTime

然后我得到了

ImportError: cannot import name ccDateTime

当我尝试

from frontEnd import *

我得到了

NameError: name 'ccDateTime' is not defined

我也试过传递

frontEnd.ccDateTime 

没有运气

我在Ubuntu 14.04上使用python 2.7

日历前端使用类创建日期和时间变量,而倒计时则是没有类的脚本。

这让我疯狂(短途旅行) 如何将字符串变量从日历前端传递给倒计时脚本?

frontEnd.py

#!/usr/bin/env python2.7
# todo ->pass date & time values
import datetime
import Tkinter as tk  # for Python 2.7
from Tkinter import *
import gtk

class PyApp(gtk.Window):

def __init__(self):
    super(PyApp, self).__init__()


    self.set_title("Set Crew Change Clock")
    self.set_size_request(300, 450)
    self.set_position(gtk.WIN_POS_CENTER)
    self.set_border_width(2)

    self.cal_label = gtk.Label("Click on Crew Change Date")
    self.colon = gtk.Label()
    self.colon.set_markup("<b> : </b>")
    self.time_label = gtk.Label("Set Crew Change Time")

    hour_adj=gtk.Adjustment(12, 0, 23, 1, 0, 0)
    self.hour = gtk.SpinButton(hour_adj, 0,0)

    min_adj=gtk.Adjustment(0, 0, 59, 1, 0, 0)
    self.minute = gtk.SpinButton(min_adj, 0, 0)
    self.minute.set_text('{:02d}'.format(int(min_adj.get_value())))

    # put the start button code here
    self.start_button = gtk.Button(label="Start Crew Change Clock")
    self.start_button.connect("clicked", self.on_button_click)

    calendar = gtk.Calendar() 
    calendar.connect("day_selected", self.on_day_selected)

    fix = gtk.Fixed()
    fix.put(calendar, 20, 20)
    fix.put(self.cal_label, 75, 230)
    fix.put(self.hour, 81, 275)
    fix.put(self.colon, 150, 278)
    fix.put(self.minute, 172, 275)
    fix.put(self.time_label, 85, 325)
    fix.put(self.start_button, 70, 370)

    self.add(fix)

    self.connect("destroy", gtk.main_quit)
    self.show_all()

def on_day_selected(self, widget):
    (year, month, day) = widget.get_date()
    self.cal_label.set_label(str(month+1) + "/" + str(day) + "/" + str(year))


def on_button_click(self, command):
    if __name__ == "__main__":


        ccDate = self.cal_label.get_text()
        ccTime = self.hour.get_text() + ":" + self.minute.get_text() + ":00"
        ccDateTime = str(ccDate + "  " + ccTime)


PyApp()
gtk.main()

ccClock.py

#! /usr/bin/env python
# displays Crew Change Clock
# needs date and time of crew change passed from cc_front

import datetime
import Tkinter as tk  # for Python 2.7
from Tkinter import *
from frontEnd import ccDateTime

san65 = ('Sans', 65)

def countdown(label):
  def clock():

crewChange = datetime.datetime.strptime(ccDateTime, "%m/%d/%y %H:%M:%S")
remaining = crewChange-datetime.datetime.now()
days = remaining.days
hours = int(remaining.seconds) // 3600
minutes = int(remaining.seconds % 3600) // 60
seconds = int(remaining.seconds % 60)
displayFormat = 'Crew Change \n \n \n \n {} days \n \n \n \n {}:{}:{}'.format(days, hours, format(minutes, '02d'), format(seconds, '02d'))
label.config(text= ' {}'.format(displayFormat))
label.after(1000, clock)

clock()


root = tk.Tk()
root.title("Crew Change Clock")
logo = PhotoImage(file="cc3.ppm")
label = tk.Label(root, compound=CENTER, font=san65, image=logo, fg="red", bg='black')
countdown(label)
label.pack()

root.mainloop()

2 个答案:

答案 0 :(得分:1)

您正在尝试导入在函数内定义的变量。我不认为可以做到。 在函数外部定义它并可以导入它。 &#34;如果名称 ==&#34; 主要&#34;:&#34;的目的是什么?在on_button_click()里面?

frontEnd.py

ccDateTime = ""


def on_button_click(self, command):
    if __name__ == "__main__":
        ccDate = self.cal_label.get_text()
        ccTime = self.hour.get_text() + ":" + self.minute.get_text() + ":00"
        global ccDateTime
        ccDateTime = str(ccDate + "  " + ccTime)

ccClock.py

from frontEnd import ccDateTime

print(ccDateTime)

答案 1 :(得分:0)

  

如何将字符串变量从日历前端传递给倒计时脚本?

执行此操作的一种方法是使用隐藏属性来保存您需要传递的信息。根据您的需要,这可以是一个独立的对象,类Cctime,其数据属性可能为__cctime,它将包含一些信息。每次需要传递信息时,都要创建该类的实例,并将该对象传递给另一个类。这为您提供了问责制和安全性。每个对象都是唯一的,您可以进行审核。就像在彩色纸上传递小纸条一样。

另一种方法是将它保存在类中的class属性中,该属性将在您要求时保存信息。每次传递信息后,它都可以重置为默认值。如果您不需要审计,可以使用ClassName.attribute通常的方式访问它。在您目前的代码中,您似乎正面临着该属性的范围问题。

最后,如果您的ImportError与您的脚本所在的目录相匹配,os.getcwd经常会消失。

干杯。