我一直在创建这个日历对象,可以“分配”事件 - 这些是用户想要的东西,从提取牛奶到 角落商店组织婚礼,列出考试时间表 - 特定日期。
这是我的应用程序代码(使用Python 3.4.3和PyQt 4.11.4编写)的简单版本,在该版本上可以重新创建我不断遇到的错误(如下所示):
# Imports all the needed modules.
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
# Defines variables needed for the settings dialog.
currentDate = QtCore.QDate.currentDate()
maxDate = QtCore.QDate(2999, 12, 31)
class AppSettingsDialog(QtGui.QDialog): # The Settings dialog.
def __init__(self, parent=None):
# The initializer function for the dialog.
super(AppSettingsDialog, self).__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.calendarSpecificSettings()
mainGridLayout = QtGui.QGridLayout()
mainGridLayout.addWidget(self.calendarSpecificSettingsBox,
0, 0)
self.setLayout(mainGridLayout)
self.exec_()
def calendarSpecificSettings(self):
# Creates a separator to put the widgets in.
self.calendarSpecificSettingsBox = QtGui.QGroupBox(
'Calendar Specific')
self.maxDateLabel = QtGui.QLabel('Ma&ximum Date')
self.maxDateEdit = QtGui.QDateEdit()
self.maxDateEdit.setDisplayFormat('dd MMM yyyy')
self.maxDateEdit.setDateRange(currentDate, maxDate)
self.maxDateEdit.setDate(maxDate)
self.maxDateLabel.setBuddy(self.maxDateEdit)
self.maxDateEdit.dateChanged.connect(self.maximumDateChanged)
# Call to function error here ^
self.calendarSpecificGridLayout = QtGui.QGridLayout()
self.calendarSpecificGridLayout.addWidget(self.maxDateLabel,
0, 0)
self.calendarSpecificGridLayout.addWidget(self.maxDateEdit,
0, 1)
self.calendarSpecificSettingsBox.setLayout(
self.calendarSpecificGridLayout)
def maximumDateChanged(self, date):
MainWindow.calWidget.setMaximumDate(date)
# ^This is the line that causes the error. I have multiple
# 'MainWindow' calls - one for each of the settings I want
# to change.
class MainWindow(QtGui.QMainWindow): # The main window.
def __init__(self):
# The initializer function for the window.
super(MainWindow, self).__init__()
mainMenu = self.menuBar()
menuOptions = mainMenu.addMenu('Options')
actionSettings = QtGui.QAction('Settings...', self)
actionSettings.triggered.connect(self.appSettings)
menuOptions.addAction(actionSettings)
calWidget = QtGui.QCalendarWidget(self)
calWidget.resize(300, 300)
calWidget.setGridVisible(True)
calWidget.setNavigationBarVisible(True)
self.setCentralWidget(calWidget)
self.statusBar().setSizeGripEnabled(True)
self.statusBar().showMessage('Ready', 5000)
def appSettings(self):
# The function that invokes the dialog.
AppSettingsDialog()
# One way to initialize the application.
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
GUI = MainWindow()
GUI.show()
sys.exit(app.exec_())
对我来说问题如下:
我正在尝试确保设置对话框中的设置更改 实际上适用于日历,但是当我更改其中任何一个时, 不断出现以下错误(它已经困扰着我的梦想):
Traceback (most recent call last):
File "C:/Python34/CalTest.py", line 50, in maximumDateChanged
mainWindow.calWidget.setMaximumDate(date)
AttributeError: type object 'MainWindow' has no attribute 'calWidget'
更糟糕的是我实际上并不理解错误。
这是否意味着calWidget
不属于MainWindow
的属性?
是因为Settings
类与MainWindow
类是分开的吗?
我已经在这个论坛(以及它之外)研究过任何相关的事情
在它上面,但我找到的任何东西都与我的问题无关。我的研究包括:
Python Attribute Error: type object has no attribute
Error: type object 'Keys' has no attribute 'chord'
但我找到的任何东西都无法解决我的问题(相信我,我试过了)。
另外,当我在它的时候,我怎么能通过对话窗口从用户那里收到几个输入?字典词典是否合适或是否有其他可以让我的生活更轻松的东西?这是因为我还没有实现添加与特定日期相关的新事件的功能,并且有一个起点将是一个祝福 - 这整个情况可能是一个不必要的噩梦。我也觉得如果我修复了这个问题,我将能够在其他操作中重新创建相同的结构(包括添加,编辑,保存和删除创建的一个或所有事件)。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:1)
您可以在函数中访问这样的calWidget:
def maximumDateChanged(self, date):
mainWindow.centralWidget().setMaximumDate(date)
# ^This is the line that causes the error. I have multiple
# 'mainWindow' calls - one for each of the settings I want
# to change.
我的回答是错误的,因为我误认为mainWindow是基于约定的实例。在您通过对话框处理MainWindow上的更改的情况下,您需要更改appSettings
方法并在mainWindow类中定义maximumDateChanged,如下所示
def appSettings(self):
# The function that invokes the dialog.
appSettingsDialog = AppSettingsDialog()
appSettingsDialog.maxDateEdit.dateChanged.connect(self.maximumDateChanged)
def maximumDateChanged(self, date):
self.centralWidget().setMaximumDate(date)