2017-04-21 88 views
0

我刚完成读取文本文件并将其设置为字典的函数,以作为简单时钟应用程序中的一部分调度使用,函数调度可以很好地工作自己在一个单独的脚本,并使用名为:当把变量赋值给函数时,dict不可调用

schedule = schedule() 
print(schedule) 

然而,当我把它在应用程序中以同样的方式,我得到一个“字典是不可调用的错误”,为什么我不能把它在我的应用程序中的相同方式

#!/usr/bin/python3 

# Full screen clock 

import tkinter as tk 
import time 

def schedule():     # this function 
    flag = False 
    schedule = dict() 
    times = [] 
    days_of_the_week = ["Monday", "Tuesday", "Wednesday", 
         "Thursday", "Friday", 
         "Saturday", "Sunday"] 
    with open("/home/pi/Desktop/schedule.txt", 'r') as f: 
     for line in f: 
      s = line.strip() 
      if s == '': 
       continue 
      elif s in days_of_the_week: 
       day = s 
       times.clear() 
      else: 
       times.append(s) 
       schedule[day] = times[:] 

    return schedule 

root = tk.Tk() 
root.attributes("-fullscreen", True) 
root.configure(background='black') 
frame = tk.Frame(root) 
frame.configure(background='black') 
frame.pack(expand=tk.TRUE) 
schedule = schedule()     # function is called here 


clock_lt = tk.Label(frame, 
       font=('Serene MTC', 230), 
       fg='#FF8000', 
       bg='black') 
clock_lt.pack() 

date_etc = tk.Label(frame, 
       font=('Ariel', 50), 
       fg='#FF8000', 
       bg='black') 
date_etc.pack() 

date_iso = tk.Label(frame, 
       font=('Ariel', 50), 
       fg='#FF8000', 
       bg='black') 
date_iso.pack() 

running_time = tk.Label(frame, 
         justify=tk.LEFT, 
       font=('Ariel', 15), 
       fg='#CDAF90', 
       bg='black') 
running_time.pack() 


def tick(): 
    schedule = schedule() 
    time1 = '' 
    time2 = time.strftime('%H:%M') 
    date_etc_txt = "%s" % (time.strftime('%A')).upper() 
    date_iso_txt = time.strftime('%d-%B-%Y').upper() 
    today = date_etc_txt.title() 


    if time2 != time1: 
     time1 = time2 
     clock_lt.config(text=time2) 
     date_etc.config(text=date_etc_txt) 
     date_iso.config(text=date_iso_txt) 
     running_time.config(text=day_schedule[today]) 

    clock_lt.after(20, tick) 

tick() 
root.mainloop() 

我不明白这里有什么不同吗?不幸的是,我不知道如果这个代码完全工作作为现在我不能让过去的这个错误,但是如果你注释掉:

schedule = schedule() 

它工作正常。

下面是测试数据我使用的是:

Friday 
08:00 - 08:30 Morning briefing 
09:15 - 10:30 Shakedown 

Saturday 
08:00 - 08:30 Morning briefing 
09:00 - 10:00 Prep and Warm Up 

Sunday 
08:00 - 08:30 Morning briefing 
09:00 - 10:00 Prep and Warm Up 

什么我做错了吗?

回答

2

您正在使用schedule作为变量和函数。

一旦你这样做,时间表不再是一个函数,而是一个变量。

因此,解释器失去了它的思想,并告诉你,你正试图调用一个字典(你认为是一个函数),但你只是将它重新分配为一个变量。

考虑使用不同的函数名(也许scheduler()

2
schedule = schedule() 

覆盖功能schedule与任何原始功能returnes(在你的情况下,dict)。从现在起scheduledict(并且不能再被调用)。

更改您将返回值存储到其他位置的变量;例如: -

sched = schedule() 

,并确保使用sched(这是一个dict)和schedule(功能)正确。在 打勾() 文件“ 文件“./fsclock.py”,行82:

+0

所以我改名为变量名day_schedule,我得到了相同的结果回溯(最后最近一次调用)? ./fsclock.py“,第65行,格式为 day_schedule = schedule() TypeError:'dict'对象不可调用 – iFunction

+0

您是在IDLE中运行它吗(还是另外一个IDE,它可以运行python解释器?)。在这种情况下,你需要重新启动解释器。 –

+1

和'schedule = schedule()'行会在您的代码中出现两次。第二次在'tick()'函数中。 –