gpt4 book ai didi

python - 通过 Python 打印日历。代码不起作用=/

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:17 24 4
gpt4 key购买 nike

我正在用 Python (PyGTK) 编写一个小程序,打印出用户输入的年份的日历(公历)。

这是我的代码:

#!/usr/bin/env python

import pygtk, gtk, subprocess
pygtk.require("2.0")

class Base:
def printing(self, widget):
text = self.textbox.get_text()
printingit = "cal -y %s | lpr" % (text)
process = subprocess.Popen(printingit.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]

def __init__(self):
self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.win.set_position(gtk.WIN_POS_CENTER)
self.win.set_size_request(350, 200)
self.win.set_resizable(False)
self.win.set_title("Calendar")
self.win.connect('destroy',lambda w: gtk.main_quit())

self.textbox = gtk.Entry()
self.textbox.set_size_request(70, 30)

self.lable = gtk.Label("Year:")

self.button = gtk.Button("Print")
self.button.set_size_request(60, 45)
self.button.connect("clicked", self.printing)

box = gtk.Fixed()
box.put(self.lable, 160, 25)
box.put(self.textbox, 140, 40)
box.put(self.button, 145, 100)

self.win.add(box)
self.win.show_all()

def main(self):
gtk.main()

if __name__ == "__main__":
base = Base()
base.main()

实际打印命令时不起作用 cal -y %s | lpr %(文本)。我已经做到了,因此它用它应该得到的最终命令替换了文本框的文本,并且它更改为我想要的 cal -y 2015 | lpr 。我尝试将其放入终端,它像往常一样工作,这让我很困惑!

我在终端中运行了该程序,这是我在尝试打印时收到的消息:

Usage: cal [general options] [-hjy] [[month] year]
cal [general options] [-hj] [-m month] [year]
ncal [general options] [-bhJjpwySM] [-s country_code] [[month] year]
ncal [general options] [-bhJeoSM] [year]
General options: [-NC3] [-A months] [-B months]
For debug the highlighting: [-H yyyy-mm-dd] [-d yyyy-mm]

如果有人理解为什么会发生这种情况,我将非常感激!先谢谢你=D

  • 哈利

最佳答案

如果要在命令中使用 shell 语法(管道),则需要将命令作为字符串传递给 Popen构造函数,而不是列表。并且您必须使用shell=True:

output = subprocess.check_output(printingit, shell=True)

如果没有它,执行的命令将与:

cal '-y' '文本' '|' 'lpr'

但是当您从文本字段获取部分输入时,您不应该直接将其传递给 shell。

或者,您可以自己创建管道:

lpr = subprocess.Popen('lpr', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process = subprocess.Popen(['cal', '-y', text], stdout=lpr.stdin)
output = lpr.communicate()
process.wait()

顺便说一句,您可以使用calendar,而不是使用子进程来调用cal模块。 cal -y 2012calendar.calendar(2014) 的作用相同,因此您可以将代码替换为:

cal = calendar.calendar(int(text))
process = subprocess.Popen(['lpr'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output = process.communicate(cal) # cal.encode(locale.getpreferredencoding(False)) for python3

关于python - 通过 Python 打印日历。代码不起作用=/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com