在我的first attempt中,我尝试过,失败了,学到了,然后又回来了以下尝试。
我有一个文本文件,其名称解析为逗号,如下所示:
Ann Marie,Smith,ams@companyname.com
该列表中可能包含超过100个名称。我遗漏了生成所有其他GUI组件的代码,专注于加载组合框和项目。
我尝试读取文本并将数据加载到组合框中而不会阻塞主线程。我查阅了一本教科书和Pythons文档,这就是我想出来的。
问题:
在我的def read_employees(self,read_file):
中,我返回了list
我读过的数据。我知道list
不是线程安全的,我在这里使用它的方式还可以吗?
在def textfilemanage(self):
中设置组合框也是如此。我通过执行self.combo = wx.ComboBox(self.panel, choices=data)
在该方法中设置组合框。那可以吗?
import wx
import concurrent.futures
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title=title, size=(300, 200))
self.panel = wx.Panel(self)
box = wx.BoxSizer(wx.VERTICAL)
self.textfilemanage()
self.label = wx.StaticText(self.panel, label="Your choice:", style=wx.ALIGN_CENTRE)
box.Add(self.label, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 20)
cblbl = wx.StaticText(self.panel, label="Combo box", style=wx.ALIGN_CENTRE)
box.Add(cblbl, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
box.Add(self.combo, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
chlbl = wx.StaticText(self.panel, label="Choice control", style=wx.ALIGN_CENTRE)
box.AddStretchSpacer()
self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo)
self.panel.SetSizer(box)
self.Centre()
self.Show()
def read_employees(self,read_file):
emp_list = []
with open(read_file) as f_obj:
for line in f_obj:
emp_list.append(line)
return emp_list
def textfilemanage(self):
filename = 'employees.txt'
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
future_to_read = {executor.submit(self.read_employees, filename)}
for future in concurrent.futures.as_completed(future_to_read):
data = future.result()
self.combo = wx.ComboBox(self.panel, choices=data)
def OnCombo(self, event):
self.label.SetLabel("You selected" + self.combo.GetValue() + " from Combobox")
app = wx.App()
Mywin(None, 'ComboBox and Choice demo')
app.MainLoop()
答案 0 :(得分:0)
for
中的textfilemanage()
- 循环等待线程完成,因此代码中的不同线程无用。
相反:
在__init__
中创建空组合框(布局所需)并将其分配给self.combo
在textfilemanage()
启动线程但不要等待它。
在read_employees()
中用
return
语句
wx.CallAfter(self.combo.Append, emp_list)
或
wx.CallAfter(self.combo.AppendItems, emp_list)
(取决于接受变体的wxPython版本)