如果有人希望在Windows上发出嘟嘟声,那么Python 2显然提供了一个有用的功能:winsound.Beep().关于这个函数的巧妙之处在于它需要参数来指定蜂鸣声的确切频率和持续时间.这正是我想要做的,除了我不使用Windows.所以...
winsound.Beep()Linux和OSX 最接近的等价物是什么,引入尽可能少的依赖项?
请注意,我希望能够直接发出扬声器,而不是播放声音文件.另外,我需要能够控制蜂鸣声的频率和持续时间,所以curses.beep()并print '\a'不会做.最后,我知道PyGame提供了广泛的声音功能,但考虑到我不需要任何PyGame的其他功能,这似乎就像使用大锤破解坚果(无论如何,我试图消除依赖性越远越好).
我有这样的文本文件:
11
2
3
4
11
111
Run Code Online (Sandbox Code Playgroud)
使用Python 2.7,我想把它变成一个行列表列表,其中换行符分隔内部列表中的项目,空行划分外部列表中的项目.像这样:
[["11","2","3","4"],["11"],["111"]]
Run Code Online (Sandbox Code Playgroud)
为此,我编写了一个生成器函数,一旦传递一个打开的文件对象,就会一次生成一个内部列表:
def readParag(fileObj):
currentParag = []
for line in fileObj:
stripped = line.rstrip()
if len(stripped) > 0: currentParag.append(stripped)
elif len(currentParag) > 0:
yield currentParag
currentParag = []
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以从列表理解中调用它,产生所需的结果.然而,随后我发现我可能能够更简洁地使用相同的东西itertools.takewhile(为了将生成器函数重写为生成器表达式,但我们现在将保留它).这是我试过的:
from itertools import takewhile
def readParag(fileObj):
yield [ln.rstrip() for ln in takewhile(lambda line: line != "\n", fileObj)]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,生成的生成器只产生一个结果(预期的第一个结果,即["11","2","3","4"]).我曾希望next再次调用它的方法会使它takewhile(lambda line: line != "\n", fileObj)再次对文件的其余部分进行评估,从而导致它产生另一个列表.但不是:我得到了一个StopIteration.所以我猜测take while表达式只在生成生成器对象时被评估过一次,而不是每次我都调用生成的生成器对象的next方法.
这个假设让我想知道如果再次调用生成器函数会发生什么.结果是它创建了一个新的生成器对象,["11"]在向StopIteration …
如何强制Tkinter应用程序窗口中的列宽度相等?
tkdocs网站声明如下:
每列的宽度(或每行的高度)取决于列或行中包含的小部件的宽度或高度.这意味着在草绘用户界面并将其划分为行和列时,您无需担心每个列或行的宽度相等[或高度,大概是].
http://www.tkdocs.com/tutorial/grid.html
但我希望列宽度相等,最好是使所有列的宽度取决于任何列中最宽的窗口小部件.有没有办法干净地实现这一点(即不是通过玩细胞填充,直到我通过反复试验得到它们或通过任意分配一个明显足够的最小宽度到每一列)?此外,可以选择性地对网格中的某些列(但不是所有列)执行(例如,使得列X 和 Y的大小根据列X 或 Y中最宽的小部件来确定,但是列Z的大小根据最宽的小部件来确定栏Z)?
在 kableExtra >= 0.8.0 中,将换行符插入到从 kableExtra 函数(例如or )通过管道输送到表中的文本中的规范方法是直接添加。add_header_abovepack_rows\n
但是,这似乎不适用于该escape = FALSE参数,如果文本还包含 LaTeX 代码,则需要该参数。
如何使用 强制在 kableExtra 函数中换行escape = FALSE?
library(dplyr)
library(knitr)
library(kableExtra)
starwars %>%
filter(species == 'Gungan' | species == 'Droid') %>%
arrange(species) %>%
select(name, eye_color) %>%
kbl(booktabs = TRUE) %>%
pack_rows(
index = c(
'The droids: everybody\'s favourite' = 6,
'The Gungans: only beloved of \nthose aged under $3^2$' = 3),
escape = FALSE)
Run Code Online (Sandbox Code Playgroud) 在下面,标有“ONE”、“TWO”和“THR”的按钮没有均匀分布。在我看来,问题的根源在于 Tk 假设任何包含跨越多列的小部件的一部分的列的默认最小宽度。但是,这种行为似乎没有记录,所以我不确定如何适应或调整它以使列具有相等的宽度 - 包括文本小部件跨越的两列和文本未跨越的单列小部件 - 从而均匀地间隔开按钮。我可以通过反复试验来拼凑它,即填充后一列直到它与前两列匹配,但这似乎是一个糟糕的解决方案。
编辑:在下面与@jwillis0720 的讨论之后,我添加了一个额外的列 (3) 和按钮 ('FIV') 以使问题更清晰。这个问题是关于当其中一些列被多列小部件跨越而其他列不是时如何使列具有相同的宽度。
import Tkinter
master = Tkinter.Tk()
Tkinter.Button(master, text='ONE').grid(row=0, column=0)
Tkinter.Button(master, text='TWO').grid(row=0, column=1)
Tkinter.Button(master, text='THR').grid(row=0, column=2)
Tkinter.Button(master, text='FOU').grid(row=1, column=2)
Tkinter.Button(master, text='FIV').grid(row=0, column=3) # added as per above edit
Tkinter.Text(master).grid(row=1, column=0, columnspan=2)
master.mainloop()
Run Code Online (Sandbox Code Playgroud)
请注意,使用grid_columnconfigurewithuniform并不能解决这个问题。插入以下几行(请参阅此处对类似问题的回答:How to create equal-width columns in Python 2.7 with Tkinter)只会使列变得有弹性;它们的大小仍然不均匀:
master.grid_columnconfigure(0, weight=1, uniform='a')
master.grid_columnconfigure(1, weight=1, uniform='a')
master.grid_columnconfigure(2, weight=1, uniform='a')
master.grid_columnconfigure(3, weight=1, uniform='a') # added as per above edit
Run Code Online (Sandbox Code Playgroud) 假设我有一些数据,我创建了一个线性模型来拟合数据.然后我使用ggplot2绘制数据,我想将线性模型添加到绘图中.据我所知,这是标准的做法(使用内置cars数据集):
library(ggplot2)
fit <- lm(dist ~ speed, data = cars)
summary(fit)
p <- ggplot(cars, aes(speed, dist))
p <- p + geom_point()
p <- p + geom_smooth(method='lm')
p
Run Code Online (Sandbox Code Playgroud)
但是,上面违反了DRY原则('不要重复自己'):它涉及在调用中创建线性模型lm,然后在调用中重新创建它geom_smooth.这对我来说似乎不优雅,它也为bug提供了空间.例如,如果我更改了创建的模型lm但忘记更改使用创建的模型geom_smooth,则摘要和绘图将不是同一模型.
有没有办法使用ggplot2绘制已经存在的线性模型,例如将lm对象本身传递给geom_smooth函数?
NetworkX主要用于图形分析,PyGraphviz主要用于绘图,它们旨在协同工作.然而,至少有一个方面,NetworkX的图形绘制(通过MatPlotLib)优于PyGraphviz的图形绘制(通过Graphviz),即NetworkX具有弹簧布局算法(可通过spring_layout函数访问)专门用于有向图,而PyGraphviz有几个弹簧布局算法(可通过neato程序和其他方法访问),将有向图布置为无向图.真正处理图形中方向的唯一Graphviz/PyGraphviz布局程序是dot,但dot创建分层布局,而不是强制定向布局.
下面是一个示例,显示了有向图的弹簧布局的NetworkX和PyGraphviz之间的区别:
import networkx as nx
import pygraphviz as pgv
import matplotlib.pyplot as ppt
edgelist = [(1,2),(1,9),(3,2),(3,9),(4,5),(4,6),(4,9),(5,9),(7,8),(7,9)]
nxd = nx.DiGraph()
nxu = nx.Graph()
gvd = pgv.AGraph(directed=True)
gvu = pgv.AGraph()
nxd.add_edges_from(edgelist)
nxu.add_edges_from(edgelist)
gvd.add_edges_from(edgelist)
gvu.add_edges_from(edgelist)
pos1 = nx.spring_layout(nxd)
nx.draw_networkx(nxd,pos1)
ppt.savefig('1_networkx_directed.png')
ppt.clf()
pos2 = nx.spring_layout(nxu)
nx.draw_networkx(nxu,pos2)
ppt.savefig('2_networkx_undirected.png')
ppt.clf()
gvd.layout(prog='neato')
gvd.draw('3_pygraphviz_directed.png')
gvu.layout(prog='neato')
gvu.draw('4_pygraphviz_undirected.png')
Run Code Online (Sandbox Code Playgroud)
1_networkx_directed.png :( http://farm9.staticflickr.com/8516/8521343506_0c5d62e013.jpg)
2_networkx_undirected.png :( http://farm9.staticflickr.com/8246/8521343490_06ba1ec8e7.jpg)
3_pygraphviz_directed.png :( http://farm9.staticflickr.com/8365/8520231171_ef7784d983.jpg)
4_pygraphviz_undirected.png :( http://farm9.staticflickr.com/8093/8520231231_80c7eab443.jpg)
绘制的第三和第四个数字基本相同,但对于箭头(整个数字已经旋转,但除此之外,没有区别).然而,第一和第二个数字的布局不同 - 而且不仅仅是因为NetworkX的布局算法引入了随机元素.
重复运行上面的代码表明这不是偶然发生的.NetworkX的spring_layout功能显然是假设如果从一个节点到另一个节点存在弧,第二个节点应该比第一个节点更接近图的中心(即,如果描述的图edgelist …
我想在Mac OSX Lion上为Cairo安装Python绑定,以便我可以将它们与Python 2.7的Apple版本一起使用.我倾向于使用Python模块等安装easy_install,但在这种情况下似乎不起作用:
$ sudo easy_install pycairo
Searching for pycairo
Reading http://pypi.python.org/simple/pycairo/
Reading http://cairographics.org/pycairo
Best match: pycairo 1.10.0
Downloading http://cairographics.org/releases/pycairo-1.10.0.tar.bz2
Processing pycairo-1.10.0.tar.bz2
error: Couldn't find a setup script in /tmp/easy_install-BYpm4Y/pycairo-1.10.0.tar.bz2
Run Code Online (Sandbox Code Playgroud)
Stack Overflow上的其他地方也有类似的问题,但答案并没有解释我在这里做错了什么.
这个问题与Python 2.6有关,接受的答案使用Macport而不是easy_install,而另一个答案似乎是建议使用我上面尝试的方法(失败):
这个问题涉及从源代码构建pycairo,我不想这样做:
python ×5
macos ×2
python-2.7 ×2
r ×2
tcl ×2
tk-toolkit ×2
tkinter ×2
audio ×1
cairo ×1
easy-install ×1
generator ×1
ggplot2 ×1
graph ×1
graphviz ×1
kable ×1
kableextra ×1
latex ×1
linux ×1
networkx ×1
pycairo ×1
pygraphviz ×1
r-markdown ×1