gpt4 book ai didi

python - Tkinter 尝试使用 StringVars 显示日历日期时出现问题

转载 作者:行者123 更新时间:2023-11-30 23:31:38 25 4
gpt4 key购买 nike

我正在做一个 UI,用户必须选择一些 in-datesout-datesIn-dates是订单到达工厂的时间,并且 out-dates就是他想要收到订单的时候。

我遇到的问题是,当我单击一个 in-date 时并从日历中选择一个日期,所有in-dates填写相同的日期:

enter image description here

代码看起来很长,但其实不然。超过一半的代码是日历代码(从下面的代码class TkcClendar到底部),你甚至不需要看到它来帮助我。

# -*- coding: utf-8 -*-
import os
from Tkinter import *
import Image
import ImageTk
import tkFileDialog
import xlrd
import csv
from tkMessageBox import *
from win32com.client import Dispatch
import datetime
import time
import calendar

year = time.localtime()[0]
month = time.localtime()[1]
day =time.localtime()[2]
strdate = (str(year) + "/" + str(month) + "/" + str(day))

fnta = ("Helvetica", 10)
fnt = ("Helvetica", 10)
fntc = ("Helvetica", 10, 'bold')

lang="span"

if lang == "span":
#Spanish Options
strtitle = "Calendario"
strdays= "Do Lu Ma Mi Ju Vi Sa"
dictmonths = {'1':'Ene','2':'Feb','3':'Mar','4':'Abr','5':'May',
'6':'Jun','7':'Jul','8':'Ago','9':'Sep','10':'Oct','11':'Nov',
'12':'Dic'}
else :
#English Options
strtitle = "Calendar"
strdays = "Su Mo Tu We Th Fr Sa"
dictmonths = {'1':'Jan','2':'Feb','3':'Mar','4':'Apr','5':'May',
'6':'Jun','7':'Jul','8':'Aug','9':'Sep','10':'Oct','11':'Nov',
'12':'Dec'}

class Planificador(Frame):
def __init__(self,master):
Frame.__init__(self, master)
self.master = master
self.initUI()

def initUI(self):
self.master.title("Planner")
self.frameOne = Frame(self.master)
self.frameOne.grid(row=0,column=0)
self.frameTwo = Frame(self.master)
self.frameTwo.grid(row=0, column=1)

self.frameThree = Frame(self.master)
self.frameThree.grid(row=0, column=2)
self.frameFour = Frame(self.master)
self.frameFour.grid(row=1,column=0)
self.frameFive = Frame(self.master)
self.frameFive.grid(row=1, column=1)
self.frameSix = Frame(self.master)
self.frameSix.grid(row=1, column=2)
self.frameSeven = Frame(self.master)
self.frameSeven.grid(row=2,column=0)
self.frameEight = Frame(self.master)
self.frameEight.grid(row=2, column=1)
self.frameNine = Frame(self.master)
self.frameNine.grid(row=2, column=2)

self.start_date_menu()

def start_date_menu(self):
self.date_num = raw_input("Number of dates?")
self.n = 1

self.textoprioridad = Label(self.frameFour, text = "Day in", justify="center")
self.textoprioridad.grid(row=self.n, column=2)
self.lotestext = Label(self.frameFour, text = "Day out", justify="center")
self.lotestext.grid(row=self.n, column=3, padx=(10,0))

self.textoprioridad = Label(self.frameSix, text = "Day in", justify="center")
self.textoprioridad.grid(row=self.n, column=2)
self.lotestext = Label(self.frameSix, text = "Day out", justify="center")
self.lotestext.grid(row=self.n, column=3, padx=(10,0))

self.date_var1 = StringVar()
self.date_var1.set(" day in ")
self.date_var2 = StringVar()
self.date_var2.set(" day out")

while self.n <= int(self.date_num):
if(int(self.n) % 2) != 0:
self.fechallegada = Button(self.frameFour, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
self.fechallegada.grid(row=self.n+1, column=2)
self.fechasalida = Button(self.frameFour, textvariable=self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
self.fechasalida.grid(row=self.n+1, column=3)

else:
self.fechallegada = Button(self.frameSix, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
self.fechallegada.grid(row=self.n+1, column=2)
self.fechasalida = Button(self.frameSix, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
self.fechasalida.grid(row=self.n+1, column=3)

self.n += 1
self.anadirpiezas = Button(self.frameEight, text="add more", command=self.addpieza, width=10)
self.anadirpiezas.grid(row=0, column=3, pady=(10,10))

def addpieza(self):
if(int(self.date_num) % 2) == 0:
self.fechallegada = Button(self.frameFour, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
self.fechallegada.grid(row=int(self.date_num)+1, column=2)
self.fechasalida = Button(self.frameFour, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
self.fechasalida.grid(row=int(self.date_num)+1, column=3)
else:
self.fechallegada = Button(self.frameSix, textvariable=self.date_var1, command=lambda:self.fnCalendar(self.date_var1))
self.fechallegada.grid(row=int(self.date_num)+1, column=2)
self.fechasalida = Button(self.frameSix, textvariable= self.date_var2, command=lambda:self.fnCalendar(self.date_var2))
self.fechasalida.grid(row=int(self.date_num)+1, column=3)

self.date_num = int(self.date_num)+1

def fnCalendar(self, datebar):
tkCalendar(self.master, year, month, day, datebar)

class tkCalendar :
def __init__ (self, master, arg_year, arg_month, arg_day,
arg_parent_updatable_var):
self.update_var = arg_parent_updatable_var
top = self.top = Toplevel(master)
top.title("Eleccion de fecha")
try : self.intmonth = int(arg_month)
except: self.intmonth = int(1)
self.canvas =Canvas (top, width =200, height =220,
relief =RIDGE, background ="#ece9d8", borderwidth =0)
self.canvas.create_rectangle(0,0,303,30, fill="#ece9d8",width=0 )
self.canvas.create_text(100,17, text="Elige una fecha", font=fntc, fill="#BA1111")
stryear = str(arg_year)

self.year_var=StringVar()
self.year_var.set(stryear)
self.lblYear = Label(top, textvariable = self.year_var,
font = fnta, background="#ece9d8")
self.lblYear.place(x=85, y = 30)

self.month_var=StringVar()
strnummonth = str(self.intmonth)
strmonth = dictmonths[strnummonth]
self.month_var.set(strmonth)

self.lblYear = Label(top, textvariable = self.month_var,
font = fnta, background="#ece9d8")
self.lblYear.place(x=85, y = 50)
#Variable muy usada
tagBaseButton = "Arrow"
self.tagBaseNumber = "DayButton"
#draw year arrows
x,y = 40, 43
tagThisButton = "leftyear"
tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
x,y = 150, 43
tagThisButton = "rightyear"
tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
#draw month arrows
x,y = 40, 63
tagThisButton = "leftmonth"
tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
self.fnCreateLeftArrow(self.canvas, x,y, tagFinalThisButton)
x,y = 150, 63
tagThisButton = "rightmonth"
tagFinalThisButton = tuple((tagBaseButton,tagThisButton))
self.fnCreateRightArrow(self.canvas, x,y, tagFinalThisButton)
#Print days
self.canvas.create_text(100,90, text=strdays, font=fnta)
self.canvas.pack (expand =1, fill =BOTH)
self.canvas.tag_bind ("Arrow", "<ButtonRelease-1>", self.fnClick)
self.canvas.tag_bind ("Arrow", "<Enter>", self.fnOnMouseOver)
self.canvas.tag_bind ("Arrow", "<Leave>", self.fnOnMouseOut)
self.fnFillCalendar()

def fnCreateRightArrow(self, canv, x, y, strtagname):
canv.create_polygon(x,y, [[x+0,y-5], [x+10, y-5] , [x+10,y-10] ,
[x+20,y+0], [x+10,y+10] , [x+10,y+5] , [x+0,y+5]],
tags = strtagname , fill="black", width=0)

def fnCreateLeftArrow(self, canv, x, y, strtagname):
canv.create_polygon(x,y, [[x+10,y-10], [x+10, y-5] , [x+20,y-5] ,
[x+20,y+5], [x+10,y+5] , [x+10,y+10] ],
tags = strtagname , fill="black", width=0)


def fnClick(self,event):
owntags =self.canvas.gettags(CURRENT)
if "rightyear" in owntags:
intyear = int(self.year_var.get())
intyear +=1
stryear = str(intyear)
self.year_var.set(stryear)
if "leftyear" in owntags:
intyear = int(self.year_var.get())
intyear -=1
stryear = str(intyear)
self.year_var.set(stryear)
if "rightmonth" in owntags:
if self.intmonth < 12 :
self.intmonth += 1
strnummonth = str(self.intmonth)
strmonth = dictmonths[strnummonth]
self.month_var.set(strmonth)
else :
self.intmonth = 1
strnummonth = str(self.intmonth)
strmonth = dictmonths[strnummonth]
self.month_var.set(strmonth)
intyear = int(self.year_var.get())
intyear +=1
stryear = str(intyear)
self.year_var.set(stryear)
if "leftmonth" in owntags:
if self.intmonth > 1 :
self.intmonth -= 1
strnummonth = str(self.intmonth)
strmonth = dictmonths[strnummonth]
self.month_var.set(strmonth)
else :
self.intmonth = 12
strnummonth = str(self.intmonth)
strmonth = dictmonths[strnummonth]
self.month_var.set(strmonth)
intyear = int(self.year_var.get())
intyear -=1
stryear = str(intyear)
self.year_var.set(stryear)
self.fnFillCalendar()
def fnFillCalendar(self):
init_x_pos = 20
arr_y_pos = [110,130,150,170,190,210]
intposarr = 0
self.canvas.delete("DayButton")
self.canvas.update()
intyear = int(self.year_var.get())
monthcal = calendar.monthcalendar(intyear, self.intmonth)
for row in monthcal:
xpos = init_x_pos
ypos = arr_y_pos[intposarr]
for item in row:
stritem = str(item)
if stritem == "0":
xpos += 27
else :
tagNumber = tuple((self.tagBaseNumber,stritem))
self.canvas.create_text(xpos, ypos , text=stritem,
font=fnta,tags=tagNumber)
xpos += 27
intposarr += 1
self.canvas.tag_bind ("DayButton", "<ButtonRelease-1>", self.fnClickNumber)
self.canvas.tag_bind ("DayButton", "<Enter>", self.fnOnMouseOver)
self.canvas.tag_bind ("DayButton", "<Leave>", self.fnOnMouseOut)

def fnClickNumber(self,event):
owntags =self.canvas.gettags(CURRENT)
for x in owntags:
if (x == "current") or (x == "DayButton"): pass
else :
strdate = (str(self.year_var.get()) + "/" +
str(self.intmonth) + "/" +
str(x))
self.update_var.set(strdate)
self.top.withdraw()
def fnOnMouseOver(self,event):
self.canvas.move(CURRENT, 1, 1)
self.canvas.update()

def fnOnMouseOut(self,event):
self.canvas.move(CURRENT, -1, -1)
self.canvas.update()


if __name__ == "__main__":
root = Tk()
aplicacion = Planificador(root)
root.mainloop()

问题是我没有使用两个StringVar所需的解决方案需要 StringVar对于每个 in-dayout-date所以只有一个日期发生了变化,而不是所有日期都发生了变化,但我在尝试处理这个问题时遇到了问题,我不知道该怎么做,另外,还有一个 add more按钮,它将新日期添加到 UI。 UI 必须保持两列结构。

我尝试列出 StringVar 的列表并在每次迭代中选择其中之一,但它不起作用:

self.stringList = []                     
for i in xrange(int(self.date_num)*2):
self.stringList.append(StringVar())
self.stringList[i].set(" date ")

有什么办法可以解决这个问题吗?

最佳答案

下面是对您的Planificador类的更改,我认为这些更改使其能够按照您想要的独立日期StringVar的方式运行。使用添加更多按钮动态添加日期的功能也有效。关于创建 StringVar 列表,您基本上有正确的想法。除此之外,它还将相应的按钮放入其中以保存它们。

我在您的代码中注意到的一件事是,您似乎不明白传递给grid()的rowcolumn关键字参数值小部件的方法是相对于小部件的框架本身而不是其父级的。这实际上是使用框架的有用之处之一,因为它可以极大地简化布局。

screenshoot of working dialog


class Planificador(Frame):
def __init__(self,master):
Frame.__init__(self, master)
self.master = master
self.initUI()

def initUI(self):
self.master.title("Planner")
self.frameOne = Frame(self.master)
self.frameOne.grid(row=0,column=0)
self.frameTwo = Frame(self.master)
self.frameTwo.grid(row=0, column=1)
self.frameThree = Frame(self.master)
self.frameThree.grid(row=0, column=2)

self.frameFour = Frame(self.master)
self.frameFour.grid(row=1,column=0, sticky=N)
self.frameFive = Frame(self.master)
self.frameFive.grid(row=1, column=1)
self.frameSix = Frame(self.master)
self.frameSix.grid(row=1, column=2, sticky=N)

self.frameSeven = Frame(self.master)
self.frameSeven.grid(row=2,column=0)
self.frameEight = Frame(self.master)
self.frameEight.grid(row=2, column=1, sticky=S)
self.frameNine = Frame(self.master)
self.frameNine.grid(row=2, column=2)

self.start_date_menu()

def start_date_menu(self):
initial_num_dates = int(raw_input("Number of dates?"))
# initial_num_dates = 5
self.DATE_MENU_ROW = 0 # initial date menu grid row
self.COL_WIDTH = 10 # width of each subcolumn of dates

for frame in (self.frameFour, self.frameSix):
self.textoprioridad = Label(frame, text="Day in",
width=self.COL_WIDTH, justify="center")
self.textoprioridad.grid(row=self.DATE_MENU_ROW, column=0)
self.lotestext = Label(frame, text="Day out", width=self.COL_WIDTH,
justify="center")
self.lotestext.grid(row=self.DATE_MENU_ROW, column=1)

self.dates = [self.create_date_entry(date_index)
for date_index in xrange(initial_num_dates)]

self.anadirpiezas = Button(self.frameEight, text="add more",
command=self.addpieza, width=self.COL_WIDTH)
self.anadirpiezas.grid(row=0, column=3)

def addpieza(self):
self.dates.append(self.create_date_entry(len(self.dates)))

def create_date_entry(self, date_index):
# create and return seq of two pairs of button, stringvar for a date
menu_col = date_index % 2 # left/right column of the date frame
menu_row = self.DATE_MENU_ROW + date_index/2 + 1
frame = self.frameSix if menu_col else self.frameFour
pairs = []
for col in 0, 1:
pairs.append(StringVar(value="--------"))
pairs.append(Button(frame, textvariable=pairs[-1],
width=self.COL_WIDTH,
command=lambda v=pairs[-1]: self.fnCalendar(v)))
pairs[-1].grid(row=menu_row, column=col)
return tuple(pairs)

def fnCalendar(self, datebar):
tkCalendar(self.master, year, month, day, datebar)

我还更改了类 tkCalendarfnClickNumber()方法,因此它始终返回具有 2 位数月份和日期值的日期,但其使用是可选的。

    def fnClickNumber(self,event):
owntags =self.canvas.gettags(CURRENT)
for x in owntags:
if (x == "current") or (x == "DayButton"): pass
else:
strdate = (str(self.year_var.get()) + "/" +
'%02d' % self.intmonth + "/" +
'%02d' % int(x))
self.update_var.set(strdate)
self.top.withdraw()

关于python - Tkinter 尝试使用 StringVars 显示日历日期时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com