【问题标题】:Python QtGui Calendar Widget Call buttonPython QtGui 日历小部件调用按钮
【发布时间】:2014-08-26 14:26:16
【问题描述】:

我正在使用 Python 的日历小部件。单击按钮时,我需要调用小部件。 情况是我找不到显示小部件本身的日历类中的方法是什么。 日历类取自这里: http://www.eurion.net/python-snippets/snippet/Calendar_Date%20picker.html

这是我的导入:

from tkinter import *
from tkinter import ttk
import tkinter.messagebox
import time
import requests #needs to be installed
import pymysql #needs to be installed
import csv 
import win32com.client #needs to be installed
from calendar import Calendar
import datetime

这里是按钮的创建:

# Calendar Buttons
calBut=ttk.Button(f2, width=4, text="Cal",       command=Calendar.what_method?).grid(column=3,row=1, sticky=W)

据我所知,我可以设置按钮的命令来调用位于日历类中的小部件显示方法。 如何获取每次单击我的按钮时显示日历小部件的方法?显示的都没有显示小部件。

使用 Python 3.3.5 蜘蛛 WinPython 3.3.5

**编辑**

程序有选项卡,f2 表示按钮所在的选项卡。

from tkinter import *
from tkinter import ttk
import tkinter.messagebox
import time
import requests #needs to be installed
import pymysql #needs to be installed
import csv 
import win32com.client #needs to be installed
import datetime
from calendar import Calendar
import calendar


#################################
# Create Button Click Calendar

 def callback():
    root2=Toplevel(f2)
    ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY)
    ttkcal.pack(expand=1, fill='both')
    root2.update()
    root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight())



 # Calendar Buttons

 b=ttk.Button(f2, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)

当我按下按钮时,它会打开日历窗口,但它是空的。控制台给了我错误:

TypeError: __init__() got multiple values for argument 'firstweekday

谢谢

【问题讨论】:

    标签: python calendar widget qwidget qtgui


    【解决方案1】:

    没那么容易。问题是您混合了两个 GUI 库。因此需要两个主要的事件循环(至少):一个用于Tkinter 代码,一个用于PyQt 代码。
    一种做你想做的事的方法——使用subprocessthreading模块在不同的线程中运行calendar.py。示例:

    from tkinter import *
    from tkinter import ttk
    
    import subprocess
    import threading
    
    master = Tk()
    
    def callback():
        subprocess.call('python calendar.py')
    
    
    b=ttk.Button(master, width=4, text="Cal", command=lambda:threading.Thread(target=callback).start()).grid(column=3,row=1, sticky=W)
    
    
    mainloop()
    

    另一种方式——在回调函数中创建Qt主事件循环(肮脏的解决方案):

    from tkinter import *
    from tkinter import ttk
    from calendar import Calendar
    import sys
    from PyQt4 import QtGui
    
    master = Tk()
    
    def callback():
        app = QtGui.QApplication(sys.argv)
        gui = Calendar()
        gui.show()
        app.exec_()
    
    
    b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)
    
    mainloop()
    

    编辑:如何调用小部件。 首先,查看this 的答案,并按照kalgasnik 的建议修改您的ttkcalendar.py。然后试试这个:

    from tkinter import *
    from tkinter import ttk
    from ttkcalendar import Calendar
    import calendar
    
    master = Tk()
    
    def callback():
        root2=Toplevel(master)
        ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY)
        ttkcal.pack(expand=1, fill='both')
        root2.update()
        root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight())
    
    b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)
    
    mainloop()
    

    编辑 2. 解决问题
    好的,看来我发现了所有问题。

    1. 实际上,您导入两次相同的模块 - 标准 calendar 模块:

      from calendar import Calendar
      import calendar
      

    但是您没有从ttkcalendar 模块导入类Calendar(不要忘记按照描述进行更改 here)。 所以,导入应该是这样的:

    import ttkcalendar
    import calendar
    

    创建日历(为了清楚起见,我稍微更改了代码):

    ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)
    
    1. 在您的代码中,主窗口被初始化了两次:
      第 15 行:master = Tk()
      第 960 行:root = Tk()
      您需要删除第一次初始化。

    2. 在同一个主窗口中混合使用 pack()grid()。根据docs,这是个坏主意:

    警告:切勿在同一个主窗口中混合使用网格和打包。特金特 将愉快地度过你的余生,试图谈判一个 两位经理都满意的解决方案。与其等待,不如杀死 应用程序,并再次查看您的代码。一个常见的错误 是为某些小部件使用了错误的父级。

    所以,nb.pack(fill='both', expand='yes') 你必须写这样的东西 nb.grid(column=0, row=0, sticky=(W, E))

    最后,这里是固定代码的链接:

    ttkcalendar.py(已经修改,可以使用):
    https://gist.github.com/anonymous/5e0d973f57e185572df2

    您的脚本进行了描述的修改:
    https://gist.github.com/anonymous/65cb808dc64e414c0c12

    【讨论】:

    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2022-10-16
    相关资源
    最近更新 更多