当前位置: 首页 > 知识库问答 >
问题:

如何在按下按钮事件时使用新的wx.panel或wx.listbox

郭元明
2023-03-14

我是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()

共有1个答案

澹台衡
2023-03-14

我不明白你是如何让发布的代码工作的。它肯定不会显示工具栏。
由于您每次都创建面板,所以它应该可以工作,而不需要您做更多的事情,但是您不应该声明框架,因为它已经创建了。
下面的代码是我认为您正在尝试的黑客版本。
注意,这段代码适用于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个项目