Создание объекта, класс которого находится в другом файловом питоне - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать виджет «Календарь» для приложения, и я нахожусь в стадии тестирования компиляции. Я знаю, что программа правильно компилируется, когда все три компонента находятся в одном файле, но я борюсь с импортом файлов классов. Пожалуйста, прости лишний код для классов, просто учтите, что мой вопрос касается того, как я импортирую файлы классов.

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()

Ошибка, которую я получаю при компиляции теста. py:

 app = Control(root)
 TypeError: 'module' object is not callable

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Вы должны импортировать класс в модуле, чтобы использовать его.

Для Control.py вам понадобятся следующие строки:

from Calendar import Calendar import tkinter as tk

И для календаря.py, вам нужны эти строки:

import tkinter as tk from Control import Control from Calendar import Calendar

В противном случае ваша программа выдаст ошибку.

0 голосов
/ 21 октября 2019

Вы импортируете модуль (файл), а не сам класс.

Измените строку импорта на:

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
...