我正在尝试为应用程序构造Calendar窗口小部件,并且我处于测试编译阶段。我知道只要所有三个组件都在同一个文件中,程序就可以正确编译,但是我在导入类文件时很费劲。 请原谅这些类的多余代码,只是请注意,我的问题是关于如何导入类文件的。
Calendar.py
import calendar
import datetime
import sys
if sys.version[0] == '2':
import Tkinter as tk
else:
import tkinter as tk
class Calendar:
def __init__(self, parent, values):
self.values = values
self.parent = parent
self.cal = calendar.TextCalendar(calendar.SUNDAY)
self.year = datetime.date.today().year
self.month = datetime.date.today().month
self.wid = []
self.day_selected = 1
self.month_selected = self.month
self.year_selected = self.year
self.day_name = ''
self.setup(self.year, self.month)
def clear(self):
for w in self.wid[:]:
w.grid_forget()
# w.destroy()
self.wid.remove(w)
def go_prev(self):
if self.month > 1:
self.month -= 1
else:
self.month = 12
self.year -= 1
# self.selected = (self.month, self.year)
self.clear()
self.setup(self.year, self.month)
def go_next(self):
if self.month < 12:
self.month += 1
else:
self.month = 1
self.year += 1
# self.selected = (self.month, self.year)
self.clear()
self.setup(self.year, self.month)
def selection(self, day, name):
self.day_selected = day
self.month_selected = self.month
self.year_selected = self.year
self.day_name = name
# data
self.values['day_selected'] = day
self.values['month_selected'] = self.month
self.values['year_selected'] = self.year
self.values['day_name'] = name
self.values['month_name'] = calendar.month_name[self.month_selected]
self.clear()
self.setup(self.year, self.month)
def setup(self, y, m):
left = tk.Button(self.parent, text='<', command=self.go_prev)
self.wid.append(left)
left.grid(row=0, column=1)
header = tk.Label(self.parent, height=2, text='{} {}'.format(calendar.month_abbr[m], str(y)))
self.wid.append(header)
header.grid(row=0, column=2, columnspan=3)
right = tk.Button(self.parent, text='>', command=self.go_next)
self.wid.append(right)
right.grid(row=0, column=5)
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for num, name in enumerate(days):
t = tk.Label(self.parent, text=name[:3])
self.wid.append(t)
t.grid(row=1, column=num)
for w, week in enumerate(self.cal.monthdayscalendar(y, m), 2):
for d, day in enumerate(week):
if day:
# print(calendar.day_name[day])
b = tk.Button(self.parent, width=1, text=day,
command=lambda day=day: self.selection(day, calendar.day_name[(day - 1) % 7]))
self.wid.append(b)
b.grid(row=w, column=d)
sel = tk.Label(self.parent, height=2, text='{} {} {} {}'.format(
self.day_name, calendar.month_name[self.month_selected], self.day_selected, self.year_selected))
self.wid.append(sel)
sel.grid(row=8, column=0, columnspan=7)
ok = tk.Button(self.parent, width=5, text='OK', command=self.kill_and_save)
self.wid.append(ok)
ok.grid(row=9, column=2, columnspan=3, pady=10)
def kill_and_save(self):
self.parent.destroy()
Control.py
import Calendar
class Control:
def __init__(self, parent):
self.parent = parent
self.choose_btn = tk.Button(self.parent, text='Choose', command=self.popup)
self.show_btn = tk.Button(self.parent, text='Show Selected', command=self.print_selected_date)
self.choose_btn.grid()
self.show_btn.grid()
self.data = {}
def popup(self):
child = tk.Toplevel()
cal = Calendar(child, self.data)
def print_selected_date(self):
print(self.data)
test.py
import tkinter as tk
import Control
import Calendar
root = tk.Tk()
app = Control(root)
root.mainloop()
我编译test.py时收到的错误:
app = Control(root)
TypeError: 'module' object is not callable
答案 0 :(得分:0)
您要导入模块(文件),而不是类本身。
将导入行更改为:
from Calendar import Calendar
并在您的test.py中:
from Control import Control
from Calendar import Calendar # but you can remove this import because you don't use it
答案 1 :(得分:0)
您必须在模块中导入该类才能使用它。
对于Control.py, 您需要这些行:
from Calendar import Calendar
import tkinter as tk
对于Calendar.py, 您需要这些行:
import tkinter as tk
from Control import Control
from Calendar import Calendar
否则,您的程序将引发错误。