在另一个文件python中构造类的对象

时间:2019-10-21 09:50:29

标签: python oop import

我正在尝试为应用程序构造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

2 个答案:

答案 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

否则,您的程序将引发错误。