Найти - Пользователи
Полная версия: Вытащить значение из метода класса
Начало » Python для новичков » Вытащить значение из метода класса
1 2
Cover Story
Всем доброго!
Имеется скрипт:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Description: a calendar-widget for Tkinter
Version: 0.2
Copyright: 2004 by Markus Weihs (ehm_dot_weihs_at_utanet_dot_at)
Created: 2004-07-17
Last modified: 2004-07-18
Licence: free
Requirements: Python,Tkinter
'''

import Tkinter as tk
from calendar import setfirstweekday, monthcalendar

class TkCalendar(tk.Frame):


def __init__(self, master, y, m, us=0):
tk.Frame.__init__(self, master, bd=2, relief=tk.GROOVE)
self.year = y
self.month = m
self.date = tk.StringVar()

if us:
self.dayArray = ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
self.col = 0
setfirstweekday(6)
else:
self.dayArray = ["Пн","Вт","Ср","Чт","Пт","Сб","Вс"]
self.col = 6

f = tk.Frame(self)
f.pack(fill=tk.X)
tk.Button(f,
text='<',
command=self.__decrease,
relief=tk.FLAT).pack(side=tk.LEFT)
self.l = tk.Label(f,text="%.2i.%i" % (self.month,self.year))
self.l.pack(side=tk.LEFT,padx=12)
tk.Button(f,
text='>',
command=self.__increase,
relief=tk.FLAT).pack(side=tk.RIGHT)

self.c = tk.Canvas(self,
width=140,height=135,
bg='white',bd=2,relief=tk.GROOVE)
self.c.bind('<1>', self.__click)
self.c.pack()

self.__fill_canvas()

def __fill_canvas(self):
m = monthcalendar(self.year,self.month)

for col in range(len(m[0])):
for row in range(len(m)):
if m[row][col]==0:
pass
else:
if col==self.col:
self.c.create_text(
col*20+12,row*20+30,
text="%2i" % m[row][col],fill='red',tags='day')
else:
self.c.create_text(
col*20+12,row*20+30,
text="%2i" % m[row][col],tags='day')
x=12; y=10
for i in self.dayArray:
self.c.create_text(x,y,text=i,fill='blue', tags='day')
x+=20

def __decrease(self):
self.c.delete('day')
if self.month == 1:
self.year -= 1
self.month = 12
else:
self.month -= 1
self.l.configure(text="%.2i.%i" % (self.month, self.year))
self.__fill_canvas()


def __increase(self):
self.c.delete('day')
if self.month == 12:
self.year += 1
self.month = 1
else:
self.month += 1
self.l.configure(text="%.2i.%i" % (self.month, self.year))
self.__fill_canvas()

def __click(self,event):
x = self.c.find_closest(event.x,event.y)[0]
try:
day = self.c.itemcget(x,'text')
self.date.set("%.2i.%.2i.%i" % (int(day),self.month,self.year))
print self.date.get()
except: pass

if __name__ == '__main__':
from time import localtime
year,month = localtime()[0:2]
root = tk.Tk()
c = TkCalendar(root, year, month) # european version
#c = TkCalendar(year, month, us=1) # us version
c.pack()
root.mainloop()
В котором есть метод __click, как сделать чтобы его значение выводилось не только в шел, но можно было бы использовать ее как переменную?
SvartalF
Заменить print на return в методе?
Cover Story
Извиняюсь я немного не понял либо у меня просто не получается. Заменил я print на return и как теперь вызвать этот метод?
igor.kaist
Могу скинуть пример использования этого модуля, либо смотри исходники листа продаж на моем сайте, где используется этот модуль :)
Cover Story
igor.kaist на твоем сайте я так и не смог авторизоваться. Если не трудно скинь пожалуйста.
Хотя, лучше бы было если бы кто-то пояснил бы как это делается.
bw
> Заменил я print на return и как теперь вызвать этот метод?
Никак вне класса, это защищенный метод, без магии его не вызовешь. Смени имя метода, убери подчеркивание в начале.
Ты всегда можешь получить дату выполняя self.date.get(), зачем дополнительно и этот метод вызывать? Этот метод является обработчиком события и использовать его как то еще - не правильно.

..bw
igor.kaist
Вот модуль, который я использовал, доработан чуть для поддержки русского….
tkCalendar.zip
Вот пример использования:
import time
from Tkinter import *
root=Tk()
import tkCalendar
date=StringVar() # здесь будет храниться дата, сюда же выводиться
s=time.gmtime()[0:3] # получили текущую дату (2009,11,12)
# чтоб на кнопочке отобразилась сегодняшняя дата...
date.set('-'.join((str(s[0]),str(s[1]),str(s[2]))))
# tkCalendar.tkCalendar(виджет, год, дата, число, текствариабла) :)
c=Button(root,textvariable=date,command=lambda:tkCalendar.tkCalendar(root,s[0], s[1], s[2], date))
c.pack()
root.mainloop()
Cover Story
igor.kaist Спасибо! То что нужно!!!
И все таки хотелось бы разобраться с вопросом! Вот тут я изменил код он естественно не работает, может быть поможете исправить или направить в правильное русло?
# -*- coding: utf-8 -*-

import Tkinter as tk
from calendar import setfirstweekday, monthcalendar

class TkCalendar(tk.Frame):


def __init__(self, master, y, m, update_var, us=0):
tk.Frame.__init__(self, master, bd=2, relief=tk.GROOVE)
self.update_v = update_var
self.year = y
self.month = m
self.date = tk.StringVar()

if us:
self.dayArray = ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
self.col = 0
setfirstweekday(6)
else:
self.dayArray = ["Пн","Вт","Ср","Чт","Пт","Сб","Вс"]
self.col = 6

f = tk.Frame(self)
f.pack(fill=tk.X)
tk.Button(f,
text='<',
command=self.__decrease,
relief=tk.FLAT).pack(side=tk.LEFT)
self.l = tk.Label(f,text="%.2i.%i" % (self.month,self.year))
self.l.pack(side=tk.LEFT,padx=12)
tk.Button(f,
text='>',
command=self.__increase,
relief=tk.FLAT).pack(side=tk.RIGHT)

self.c = tk.Canvas(self,
width=140,height=135,
bg='white',bd=2,relief=tk.GROOVE)
self.c.bind('<1>', self.__click)
self.c.pack()

self.__fill_canvas()

def __fill_canvas(self):
m = monthcalendar(self.year,self.month)

for col in range(len(m[0])):
for row in range(len(m)):
if m[row][col]==0:
pass
else:
if col==self.col:
self.c.create_text(
col*20+12,row*20+30,
text="%2i" % m[row][col],fill='red',tags='day')
else:
self.c.create_text(
col*20+12,row*20+30,
text="%2i" % m[row][col],tags='day')
x=12; y=10
for i in self.dayArray:
self.c.create_text(x,y,text=i,fill='blue', tags='day')
x+=20

def __decrease(self):
self.c.delete('day')
if self.month == 1:
self.year -= 1
self.month = 12
else:
self.month -= 1
self.l.configure(text="%.2i.%i" % (self.month, self.year))
self.__fill_canvas()


def __increase(self):
self.c.delete('day')
if self.month == 12:
self.year += 1
self.month = 1
else:
self.month += 1
self.l.configure(text="%.2i.%i" % (self.month, self.year))
self.__fill_canvas()

def __click(self,event):
x = self.c.find_closest(event.x,event.y)[0]
try:
day = self.c.itemcget(x,'text')
self.date.set("%.2i.%.2i.%i" % (int(day),self.month,self.year))
self.update_v.set(self.date.get())
except: pass

if __name__ == '__main__':
from time import localtime
year,month = localtime()[0:2]
root = tk.Tk()
date=tk.StringVar()
c = TkCalendar(root, year, month, date) # european version
root.title(date)
c.pack()
root.mainloop()
igor.kaist
Получилось замечательно!
Вот смотри… ( весь код не буду постить, только изменения)
........
class TkCalendar(tk.Frame):
def __init__(self, master, y, m, update_var, us=0,command=None):
self.command=command
.......
def __click(self,event):
x = self.c.find_closest(event.x,event.y)[0]
try:
day = self.c.itemcget(x,'text')
self.date.set("%.2i.%.2i.%i" % (int(day),self.month,self.year))
self.update_v.set(self.date.get())
# вызываем....
self.command.__call__(self.date.get())
except: pass
..........
if __name__ == '__main__':
from time import localtime
year,month = localtime()[0:2]
root = tk.Tk()
date=tk.StringVar()
def some_function(date): # эта функция будет вызываться при щелкании на дату...
print date
# вводим дополнительный пераметр command
c = TkCalendar(root, year, month, date,command=some_function)
Еще немного допилить и получится замечательный виджет…
P.S. Кстати, значение выбранной даты и без этого всегда было доступно по data.get()
bw
А почему command.__call__?
Тогда уж:
except:
pass
else:
if self.command:
self.command(self.date.get())
..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB