gpt4 book ai didi

python - 为什么我的对话框类相互写入?

转载 作者:行者123 更新时间:2023-11-28 23:04:51 25 4
gpt4 key购买 nike

我正在开发一个将用于时间运动研究的程序。有时用户可能必须创建新对象(观察者、受试者、诊所)。为了实现这一点,我使用了模式对话框(因为所有数据都与受试者、观察者和诊所相关联)。

我已经为对话框创建了一个通用类,然后为每个对话框创建了一个此类的实例。但是,当用户创建一个包含一个类的新条目,然后再创建另一个类时,将再次创建先前的类输入,从而导致数据重复。

我不太确定发生了什么,正在寻求帮助:

这是我的通用对话框类:

class NewDataDialog(wx.Dialog):
def __init__(self, parent, id, title, databoxes, pubsubmessage):
wx.Dialog.__init__(self,parent,id, title)

self.databoxes = databoxes
self.pubsubmessage = pubsubmessage
# MainSizer Creation
self.MainSizer = wx.BoxSizer(wx.VERTICAL)

# Top Label Creation and addition to Main Sizer
self.TopLbl = wx.StaticText(self, -1, "Create a " + title)
self.TopLbl.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))
self.MainSizer.Add(self.TopLbl, 0, wx.ALL|wx.ALIGN_CENTER, 5)

self.SubSizer = wx.BoxSizer(wx.HORIZONTAL)

# Labels
self.LblSizer = wx.BoxSizer(wx.VERTICAL)

for lbl in databoxes:
self.lbl = wx.StaticText(self, -1, lbl+":")
self.LblSizer.Add(self.lbl, 0, wx.ALL|wx.ALIGN_LEFT, 5)


self.SubSizer.Add(self.LblSizer, 0, wx.ALL|wx.ALIGN_LEFT, 5)

# Boxes
self.InputSizer = wx.BoxSizer(wx.VERTICAL)

for lbl in databoxes:
self.box = wx.TextCtrl(self, -1, style=wx.ALIGN_LEFT)
self.InputSizer.Add(self.box, 0, wx.ALL, 1)

self.SubSizer.Add(self.InputSizer, 0, wx.ALL|wx.ALIGN_LEFT, 5)
self.MainSizer.Add(self.SubSizer, 0, wx.ALL|wx.ALIGN_CENTER, 5)

# Save and Cancel Buttons
self.buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
self.saveButton = SaveButton(self, 'Save')
self.cancelButton = CancelButton(self, 'Cancel')
self.buttonSizer.Add(self.saveButton, 0, wx.ALL|wx.ALIGN_CENTER, 5)
self.buttonSizer.Add(self.cancelButton, 0, wx.ALL|wx.ALIGN_CENTER, 5)

self.MainSizer.Add(self.buttonSizer, 0, wx.ALL|wx.ALIGN_CENTER, 5)
self.SetSizerAndFit(self.MainSizer)

pub.subscribe(self.cancelbutton, "mainpanel.CancelButton")
pub.subscribe(self.savebutton, "mainpanel.SaveButton")

def cancelbutton(self, message):

self.Close()


def savebutton(self, message):

results = []

for lbl in self.databoxes:
results.append(self.box.GetValue())

pub.sendMessage(self.pubsubmessage, results)
self.Close()

class CancelButton(wx.Panel):
def __init__(self, parent, title):

wx.Panel.__init__(self, parent)

self.dialogbutton = wx.Button(self, -1, title)

self.Bind(wx.EVT_BUTTON, self.OnButtonActivate, self.dialogbutton)


def OnButtonActivate(self, event):

pub.sendMessage("mainpanel.CancelButton", "")


class SaveButton(CancelButton):

def OnButtonActivate(self, event):

pub.sendMessage("mainpanel.SaveButton", "")

下面是对话框的每个实例的创建:

def newsubject(self, message):

titles = ["Full Name", "Initials", "Job Title"]
self.newsubject = NewDataDialog(self, 0, 'New Subject', titles, "MainPanel.NewSubjectDialog.Save")
self.newsubject.ShowModal()

def newobserver(self, message):

titles = ["Full Name", "Initials"]
self.newobserver = NewDataDialog(self, 1, 'New Observer', titles, "MainPanel.NewObserverDialog.Save")
self.newobserver.ShowModal()

def newclinic(self, message):

titles = ["Clinic Name","Location","Initials"]
self.newclinic = NewDataDialog(self, 2, 'New Clinic', titles, "MainPanel.NewClinicDialog.Save")
self.newclinic.ShowModal()

如果用户选择一个标记为他们想要的操作的按钮,则调用其中的每一个。 IE。 “创建新观察者”将运行函数 newobserver

有关代码的完整 View ,您可以查看 here . 注意:并非所有评论都被正确注释,还有其他文件作为其中的一部分,因此不会运行,但希望能让您更深入地了解正在发生的事情

最佳答案

您正在 self.newsubjectself.newobserverself.newclinic 中存储对 NewDataDialog 实例的引用>。这意味着对象继续存在,并监听 "mainpanel.SaveButton" 事件,即使在 newsubjectnewobservernewclinic 方法退出。一旦您打开了每种对话框中的一个,总会有三个这样的对象卡在周围,每个 "mainpanel.SaveButton" 事件都会导致所有三个对象尝试保存它们的数据。

如果您没有存储这些引用,那么这些对象将 apparently被垃圾收集,并自动删除订阅。如果您确实需要存储引用,那么您应该在 ShowModal() 之后安排一个unsubscribe

def cancelbutton(self, message):

pub.unsubscribe(self.savebutton, "mainpanel.SaveButton")
pub.unsubscribe(self.cancelbutton, "mainpanel.CancelButton")
self.Close()


def savebutton(self, message):

results = []

for lbl in self.databoxes:
results.append(self.box.GetValue())

pub.sendMessage(self.pubsubmessage, results)
pub.unsubscribe(self.savebutton, "mainpanel.SaveButton")
pub.unsubscribe(self.cancelbutton, "mainpanel.CancelButton")
self.Close()

关于python - 为什么我的对话框类相互写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6963189/

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