Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter窗口中日期项的行为_Python_User Interface_Tkinter_Tkcalendar - Fatal编程技术网

Python Tkinter窗口中日期项的行为

Python Tkinter窗口中日期项的行为,python,user-interface,tkinter,tkcalendar,Python,User Interface,Tkinter,Tkcalendar,我有一个按钮,可以将DateEntry小部件添加到可滚动的框架中。不幸的是,框架位于窗口底部,因此添加几行后,下拉日历隐藏在任务栏后面。有没有办法更改它,使日历在字段上方而不是下方打开 下面是一些测试代码 from tkinter import * from tkinter import ttk from tkcalendar import Calendar, DateEntry master = Tk() global rowNumForShiftReport rowNumForShift

我有一个按钮,可以将DateEntry小部件添加到可滚动的框架中。不幸的是,框架位于窗口底部,因此添加几行后,下拉日历隐藏在任务栏后面。有没有办法更改它,使日历在字段上方而不是下方打开

下面是一些测试代码

from tkinter import *
from tkinter import ttk
from tkcalendar import Calendar, DateEntry

master = Tk()

global rowNumForShiftReport
rowNumForShiftReport=0
shiftDateWidgetList=[]

def myfunction(event):
    canvas2.configure(scrollregion=canvas2.bbox("all"), width=100, height=100)

def addEntry2():
    global rowNumForShiftReport


    rowNumForShiftReport = rowNumForShiftReport + 1
    shiftDateWidgetList.append(DateEntry(frame2, state='readonly', width=15))
    shiftDateWidgetList[-1].grid(row=rowNumForShiftReport, column=0)
    rowNumForShiftReport+1


master.geometry('400x400')
btn_addField2 = ttk.Button(master, text="Add Entry",command=addEntry2)
btn_addField2.grid(row=0, column=1)
#lotFrame2 = Frame(master)
actualLabelFrame=ttk.LabelFrame(master, text="Shift Report", height=300, width=300)
actualLabelFrame.grid(row=0, column=0)
canvas2 = Canvas(actualLabelFrame,width=160)
frame2 = Frame(canvas2,width=160)
frame2.bind("<Configure>", myfunction)
canvas2.create_window((0, 0), window=frame2, anchor='nw')
scrollBar2 = ttk.Scrollbar(actualLabelFrame, orient="vertical", command=canvas2.yview)
canvas2.configure(yscrollcommand=scrollBar2.set)
scrollBar2.grid(row=0, column=2, sticky=N + S)
canvas2.grid(row=0, column=1)



mainloop()

从tkinter导入*
从tkinter导入ttk
从tkcalendar导入日历,日期输入
master=Tk()
全局行数移动报告
rowNumForShiftReport=0
shiftDateWidgetList=[]
def myfunction(事件):
canvas2.configure(scrollregion=canvas2.bbox(“全部”),宽度=100,高度=100)
def addEntry2():
全局行数移动报告
rowNumForShiftReport=rowNumForShiftReport+1
append(DateEntry(frame2,state='readonly',width=15))
shiftDateWidgetList[-1]。网格(行=rowNumForShiftReport,列=0)
rowNumForShiftReport+1
主几何(“400x400”)
btn_addField2=ttk.按钮(master,text=“添加条目”,command=addEntry2)
btn_addField2.grid(行=0,列=1)
#lotFrame2=帧(主)
actualLabelFrame=ttk.LabelFrame(主控,text=“移位报告”,高度=300,宽度=300)
actualLabelFrame.grid(行=0,列=0)
画布2=画布(实际带框,宽度=160)
框架2=框架(画布2,宽度=160)
frame2.bind(“,myfunction)
canvas2.create_window((0,0),window=frame2,anchor='nw')
scrollBar2=ttk.Scrollbar(actualLabelFrame,orient=“vertical”,command=canvas2.yview)
canvas2.configure(yscrollcommand=scrollBar2.set)
scrollBar2.grid(行=0,列=2,粘性=N+S)
canvas2.grid(行=0,列=1)
mainloop()

您可以通过扩展
DateEntry
并覆盖其
下拉菜单()来实现此目标,如下所示:

类MyDateEntry(DateEntry):
def下拉菜单(自):
“”“根据下拉日历的当前状态显示或撤消下拉日历。”“”
如果self.\u calendar.winfo\u是apped():
自我._top_cal.draw()
其他:
自我验证日期()
date=self.parse_date(self.get())
x=self.winfo_rootx()
y=self.winfo_rooty()+self.winfo_height()
如果self.winfo_toplevel().attributes('-topmost'):
self.\u top.\u cal.属性('-top',True)
其他:
self.\u top.\u cal.属性('-top',False)
#-修补程序开始:确保下拉日历可见
如果x+self.\u top\u cal.winfo\u width()>self.winfo\u screenwidth():
x=self.winfo_screenwidth()-self.\u top\u cal.winfo_width()
如果y+self.\u top\u cal.winfo\u height()>self.winfo\u screenheight()-30:
y=self.winfo_rooty()-self.\u top\u cal.winfo_height()
#-补丁端
自顶校准几何体('++%i++%i'(x,y))
自我定义
self.\u calendar.focus\u set()
自助日历选择集(日期)
然后将代码中的所有
DateEntry(…)
替换为
MyDateEntry(…)


请注意,它基于
tkcalendar
v1.6.1。

我认为您需要修补
DateEntry
以实现所需功能。是否有一些有关窗口定位的文档或教程?在创建自定义小部件类时,我总是发现很难理解正确的定位。