我是python的新手,尝试创建一个应用程序来处理来自不同CSV文件的数据。我的应用程序总是处理第一个打开的CSV文件数据,我不知道哪里是错误的在我的代码?下面是我的示例:
示例1.CSV:
ABC、DEF、GHI
1、3、7
我的应用程序将打开CSV文件,并将CSV文件的头,如ABC、DEF、GHI放入wx.listbox选择和处理一些如果你点击选择。首先打开sample1.csv看起来不错,但是当我打开sample2.csv并单击JKL、MNO、PRQ和STU时,面板将返回sample1.csv数据!我不知道为什么?是否需要清除旧面板然后创建新面板?如果是怎么办?或者我需要创建一个新的框架来处理csv数据?
谢谢你的帮助!
import csv
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (550,500))
toolbar = self.CreateToolBar()
OpenCsvBtn = wx.Button(toolbar, -1," Open CSV")
self.Bind(wx.EVT_BUTTON, self.OnClick, OpenCsvBtn)
self.Centre()
self.Show(True)
def onListBox(self, event):
self.text.AppendText( "Current selection:"+event.GetEventObject().GetStringSelection()+"\n")
def OnClick(self, event):
panel = wx.Panel(self)
print("open the csv file and get the path")
frame = wx.Frame(None, -1, 'win.py')
openFileDialog = wx.FileDialog(frame, "Open CSV file", "", "",
"CSV files (*.csv)|*.csv",
wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
openFileDialog.ShowModal()
csvPath=openFileDialog.GetPath()
print(csvPath)
with open(csvPath) as csvFile:
csvReader = csv.reader(csvFile)
i=csvReader.next()
rest = [row for row in csvReader]
print (i)
box = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel,size =(200,400), style = wx.TE_MULTILINE)
languages = i #[title[0]]
lst = wx.ListBox(panel, size = (200,400), choices = languages, style = wx.LB_SINGLE)
box.Add(lst,0,wx.EXPAND)
box.Add(self.text, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
ex = wx.App()
Mywin(None,'ListBox Demo')
ex.MainLoop()
我不明白你是如何让发布的代码工作的。它肯定不会显示工具栏。
由于您每次都创建面板,所以它应该可以工作,而不需要您做更多的事情,但是您不应该声明框架
,因为它已经创建了。
下面的代码是我认为您正在尝试的黑客版本。
注意,这段代码适用于python 2.7,但它将不能适用于python 3,因为工具栏的API已经改变
import csv
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (550,500))
toolbar = self.CreateToolBar()
open_bmp = wx.Bitmap('3.bmp')
tool1 = toolbar.AddTool(wx.ID_ANY, open_bmp, wx.NullBitmap)
toolbar.Realize()
self.Bind(wx.EVT_TOOL, self.OnClick, tool1)
self.Bind(wx.EVT_CLOSE, self.OnExit)
self.Centre()
self.Show(True)
def onListBox(self, event):
self.text.AppendText( "Current selection:"+event.GetEventObject().GetStringSelection()+"\n")
def OnClick(self, event):
panel = wx.Panel(self)
print("open the csv file and get the path")
openFileDialog = wx.FileDialog(panel, "Open CSV file", "", "",
"CSV files (*.csv)|*.csv",
wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
openFileDialog.ShowModal()
csvPath=openFileDialog.GetPath()
print(csvPath)
with open(csvPath) as csvFile:
csvReader = csv.reader(csvFile)
i=csvReader.next()
rest = [row for row in csvReader]
print (i)
box = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel,size =(200,400), style = wx.TE_MULTILINE)
languages = i #[title[0]]
lst = wx.ListBox(panel, size = (200,400), choices = languages, style = wx.LB_SINGLE)
box.Add(lst,0,wx.EXPAND)
box.Add(self.text, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
def OnExit(self, evt):
self.Destroy()
ex = wx.App()
Mywin(None,'ListBox Demo')
ex.MainLoop()
按钮事件 1、有注册错误/正确提示 bp MessageBoxA bp rtcMsgBox 如果事先找不到按钮事件,可以通过下消息断点,返回后回溯即可找到按钮事件起始位置 2、无任何提示 bp GetDlgItem 可以通过bp GetDlgItem获取按钮事件代码 3、未注册一启动或者关闭就跳出个注册框或者提示框 bp RegOpenKey(A) bp CreateFileA bp GetPri
我以编程方式生成了许多按钮(一些按钮用于增加值,而另一些按钮用于减少值),当它们调整的值达到最大值或最小值时,我会禁用这些按钮。(即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用,我还将按钮状态设置为“按下”,以直观地指示已达到极限值,并且按钮不再工作。 我的按钮onClickListener的'增加'按钮看起来像这样: ClickListeners上相应的
我很难使用< code>onKeyPressed事件。我的应用程序中有一个< code>TextField,允许用户按下[ENTER]键来实现某项功能;然而,我也为场景指定了一个默认按钮。 虽然我可以在<code>文本字段</code>中成功触发按键所需的操作,但默认按钮的操作始终首先执行。当用户位于中时,我需要完全为按键使用事件。 请参阅以下MCVE: 所需的行为是能够在键入并按 Enter 键
问题内容: 下面的代码正确返回该单元格: 但是在表视图中查找indexpath会崩溃: 我尝试了另一种方法,但是没有成功: 问题答案: 我不知道是否有简单的方法可以做到这一点。( 编辑: 实际上有。请查看@mustafa的第二个解决方案。)一种解决方法是将按钮的标签设置为in ,然后可以仅访问按钮的标签以找出按钮所属的行。 警告: 此解决方法很脆弱。如果您允许在不调用的情况下从表中添加或删除行,则
Javascript(jQuery)代码 HTML/EJS代码 我读过的一些不起作用的帖子: 如何在单击按钮时通过动画显示视图? 尝试在单击按钮时显示div
我有一个事件系统,当一个特定的对象被改变时,我可以订阅它。在收到这个事件之后,我想要为这个对象执行一个任务。 同时更改多个对象是可能的。例如。如果我改变1000个对象,我将得到1000个事件。问题是,我要执行的任务处理1个对象1000次的时间比处理1000个对象1次的时间要长得多。我不能改变事件生成的方式。 所以我想的是,当我收到这些事件的时候,把它们批量起来。例如。在一个队列中收集1000个项目