我正在学习如何使用泡菜.我创建了一个namedtuple对象,将其附加到列表中,并试图挑选该列表.但是,我收到以下错误:
pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P
Run Code Online (Sandbox Code Playgroud)
我发现,如果我运行代码而不将其包装在函数中,它就可以完美地运行.在函数内部包装时,是否需要额外的步骤来腌制对象?
这是我的代码:
from collections import namedtuple
import pickle
def pickle_test():
P = namedtuple("P", "one two three four")
my_list = []
abe = P("abraham", "lincoln", "vampire", "hunter")
my_list.append(abe)
f = open('abe.pickle', 'w')
pickle.dump(abe, f)
f.close()
pickle_test()
Run Code Online (Sandbox Code Playgroud) 我有一个小的GUI测试,带有"开始"按钮和进度条.期望的行为是:
观察到的行为是"开始"按钮冻结5秒钟,然后显示进度条(无振荡).
到目前为止,这是我的代码:
class GUI:
def __init__(self, master):
self.master = master
self.test_button = Button(self.master, command=self.tb_click)
self.test_button.configure(
text="Start", background="Grey",
padx=50
)
self.test_button.pack(side=TOP)
def progress(self):
self.prog_bar = ttk.Progressbar(
self.master, orient="horizontal",
length=200, mode="indeterminate"
)
self.prog_bar.pack(side=TOP)
def tb_click(self):
self.progress()
self.prog_bar.start()
# Simulate long running process
t = threading.Thread(target=time.sleep, args=(5,))
t.start()
t.join()
self.prog_bar.stop()
root = Tk()
root.title("Test Button")
main_ui = GUI(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
基于从布赖恩奥克利的信息在这里,我明白,我需要使用线程.我尝试创建一个线程,但我猜测,因为线程是从主线程中启动的,所以没有用.
我有想法放置在不同的类中的逻辑部分,以及从该类,类似于由A.罗达斯示例代码内实例化GUI 这里.
我的问题:
我无法弄清楚如何编码它,以便这个命令:
self.test_button = Button(self.master, command=self.tb_click)
Run Code Online (Sandbox Code Playgroud)
调用位于另一个类中的函数.这是一件坏事还是可能?我如何创建一个可以处理self.tb_click的第二类?我试着跟随A. Rodas的示例代码,它的工作非常精彩.但是我无法弄清楚如何在触发动作的Button小部件的情况下实现他的解决方案.
如果我应该在单个GUI类中处理线程,那么如何创建一个不干扰主线程的线程呢?
我正在尝试创建两个Label小部件,它们位于我的测试UI的左上角和右上角.问题是小部件粘在一起,我希望它们之间有空间.
在我的研究中,我遇到了使用粘性,padx和pady选项的建议.但无论我传递给.grid()的参数是什么,我似乎都无法在我的小部件之间创建空间.我知道,无论两个小部件之间的列数和行数是多少,如果所述行/列都是空的,那么它就好像它们不存在并且小部件看起来粘在一起.
使用.grid()方法,如何定位小部件以使它们不会粘在一起?
到目前为止,这是我的代码:
#!/usr/bin/python
from Tkinter import *
class MyApp:
def __init__(self, parent):
self.myParent = parent
self.main_container = Frame(parent)
self.main_container.grid(row=0, rowspan=2, column=0, columnspan=4)
self.top_frame = Frame(self.main_container)
self.top_frame.grid(row=0, column=0, columnspan=4)
self.top_left = Frame(self.top_frame)
self.top_left.grid(row=0, column=0, columnspan=2)
self.top_right = Frame(self.top_frame)
self.top_right.grid(row=0, column=2, columnspan=2)
self.bottom_frame = Frame(self.main_container)
self.bottom_frame.grid(row=2, column=0, columnspan=4)
self.top_left_label = Label(self.top_left, text="Top Left")
self.top_left_label.grid(row=0, column=0, sticky='W', padx=2, pady=2)
self.top_right_label = Label(self.top_right, text="Top Right")
self.top_right_label.grid(row=0, column=4, sticky='E', padx=2, pady=2)
self.text_box = Text(self.bottom_frame, height=5, width=40)
self.text_box.grid(row=0, column=0)
root = Tk()
root.title("Test UI") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jQuery以编程方式更改选项卡.我尝试在这里实现@MasterAM给出的解决方案.但是,Chrome控制台会显示错误Uncaught TypeError: undefined is not a function
这是我的HTML:
<div id="click-me-div">Click Me</div>
<ul class="nav nav-tabs">
<li class="active"><a href="#fruits" data-toggle="tab">I like Fruits</a></li>
<li><a href="#veggies" data-toggle="tab">I like Veggies Too</a></li>
<li><a href="#samosas" data-toggle="tab">But Samosa's Rock</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="fruits">Apple, Kiwi, Watermellon</div>
<div class="tab-pane" id="veggies">Kale, Spinach, Pepper</div>
<div class="tab-pane" id="samosas">Awesome, Spine Tingling, Explosive</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这是jQuery:
$(document).ready(function() {
$("#click-me-div").click(function() {
alert('yes, the click actually happened');
('.nav-tabs a[href="#samosas"]').tab('show');
});
});
Run Code Online (Sandbox Code Playgroud)
期望的结果是,如果我单击"单击我",则活动选项卡应更改为"samosas"选项卡.
我究竟做错了什么?
我无法弄清楚为什么正则表达式模式不匹配.此外,输出抱怨$found没有初始化,但我相信我这样做了.到目前为止,这是我的代码:
use strict;
use warnings;
my @strange_list = ('hungry_elephant', 'dancing_dinosaur');
my $regex_patterns = qr/
elephant$
^dancing
/x;
foreach my $item (@strange_list) {
my ($found) = $item =~ m/($regex_patterns)/i;
print "Found: $found\n";
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
Use of uninitialized value $found in concatenation (.) or string at C:\scripts\perl\sandbox\regex.pl line 13.
Found:
Use of uninitialized value $found in concatenation (.) or string at C:\scripts\perl\sandbox\regex.pl line 13.
Found:
Run Code Online (Sandbox Code Playgroud)
我需要以$found其他方式初始化吗?另外,我是否正确创建了一个多行字符串来解释为正则表达式?
非常感谢.
我最近开始使用Django REST Framework(以及Django和Python - 我是一个RTOS /嵌入式系统人员!)来实现RESTful Web API.还没有任何问题,但谷歌无法解决这个问题,但是现在这个问题让我感到难过了几个小时.
我有一个嵌入式系统,可以监听与一系列设备相关的事件 - 类似于电话拨打电话,这是我为了简洁而在此讨论的内容.电话有一个号码和一大堆与之相关的呼叫(它已经制作).呼叫具有关联的电话(拨打电话的电话)和创建时间.发生调用时,应将其POST到API.我有一个嵌入式系统,可以监听呼叫及其始发电话号码,并将其提交给API.由于嵌入式系统知道电话号码,我希望它提交:{"srcPhone":12345678}而不是{"srcPhone":"http://host/phones/5"}.这避免了我的嵌入式系统需要知道每个电话的主键(或每次想要提交呼叫时按号码获取GET电话).
Google和Django文档建议我可以用自然键实现这一点.我的尝试如下:
models.py
from django.db import models
from datetime import datetime
from pytz import timezone
import pytz
from django.contrib.auth.models import User
# Create your models here.
def zuluTimeNow():
return datetime.now(pytz.utc)
class PhoneManager(models.Manager):
def get_by_natural_key(self, number):
return self.get(number=number)
class Phone(models.Model):
objects = PhoneManager()
number = models.IntegerField(unique=True)
#def natural_key(self):
# return self.number
class Meta:
ordering = ('number',)
class Call(models.Model):
created = models.DateTimeField(default=zuluTimeNow, blank=True)
srcPhone = models.ForeignKey('Phone', related_name='calls')
class …Run Code Online (Sandbox Code Playgroud) 我想使用数据库模型控制项目的一些配置设置.例如:
class JuicerBaseSettings(models.Model):
max_rpm = model.IntegerField(default=10)
min_rpm = model.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)
应该只有这个模型的一个实例:
juicer_base = JuicerBaseSettings()
juicer_base.save()
Run Code Online (Sandbox Code Playgroud)
当然,如果有人意外地创建了一个新实例,那么这不是世界末日.我可以这样做JuicerBaseSettings.objects.all().first().但是,有没有办法将其锁定,以至于无法创建多个实例?
我在SO上发现了两个相关的问题.这个答案建议使用第三方应用程序django-singletons,这些应用程序似乎没有得到积极维护(git repo的最新更新是5年前).另一个答案建议使用权限或权限的组合OneToOneField.这两个答案都是2010-2011.
鉴于Django从那时起经历了很多变化,有没有任何标准方法可以解决这个问题?或者我应该使用.first()并接受可能存在重复的内容?
根据这个答案,应始终转义JSON字符串中的换行符.当我加载JSON时,这似乎不是必需的json.load().
我已将以下字符串保存到文件中:
{'text': 'Hello,\n How are you?'}
Run Code Online (Sandbox Code Playgroud)
加载JSON json.load()并不会引发异常,即使\n没有转义:
>>> with open('test.json', 'r') as f:
... json.load(f)
...
{'text': 'Hello,\n How are you?'}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用json.loads(),我会得到一个例外:
>>> s
'{"text": "Hello,\n How are you?"}'
>>> json.loads(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python34\lib\json\__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "c:\Python34\lib\json\decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\Python34\lib\json\decoder.py", line 359, in raw_decode
obj, …Run Code Online (Sandbox Code Playgroud) 我有一个由django-tables2生成的工作表:
my_filter = TestFilter(request.POST)
table = TestTable(TestObj.objects.all(), order_by="-my_date")
RequestConfig(request, paginate={"per_page": 10}).configure(table)
return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个包含数百个对象的表,这些对象整齐地分页,每页有10个项目.当我点击表格底部的"下一步"时,分页效果很好,我可以浏览不同的页面.但是,我注意到以下行为:
my_filter其上显示原始未过滤表的子集my_filter再次单击将显示已过滤表的第二页我希望过滤器在导航不同页面时保持不变.我在这里发现了类似的问题.该解决方案表明需要更改html代码.但是,在我的情况下,django-tables2正在生成html.
如何使用django-tables2正确实现过滤分页?
-Update-
我尝试过使用GET而不是POST:
if request.method == 'GET':
my_filter = TestFilter(request.GET)
my_choice = my_filter.data['my_choice']
table = TestTable(TestObj.objects.filter(choice=my_choice), order_by="-my_date")
RequestConfig(request, paginate={"per_page": 10}).configure(table)
return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
Run Code Online (Sandbox Code Playgroud)
我的模板:
<form action="" method="get"> {% csrf_token %}
{{ my_filter }} <input type="submit" value="Apply Filter"/>
</form>
Run Code Online (Sandbox Code Playgroud)
由于my_choiceGET中不存在KeyError,因此会导致KeyError .结果页面甚至没有加载.
是否可以使用多处理/线程加速单个任务?我的直觉是答案是'不'.以下是"单一任务"的含义示例:
for i in range(max):
pick = random.choice(['on', 'off', 'both'])
Run Code Online (Sandbox Code Playgroud)
参数为10000000,在我的系统上完成大约需要7.9秒.
我基本掌握了如何使用多处理和线程处理多个任务.例如,如果我有10个目录,每个目录包含需要读取的X个文件,我可以使用create 10个线程.
我怀疑单个任务只使用一个进程(任务管理器报告CPU使用率很小).在这种情况下,有没有办法利用我的其他核心?或者是增加CPU /内存速度是获得更快结果的唯一方法?
python ×7
django ×3
python-2.7 ×2
tkinter ×2
event-loop ×1
html ×1
javascript ×1
jquery ×1
json ×1
namedtuple ×1
perl ×1
pickle ×1
progress-bar ×1
python-3.4 ×1
regex ×1