【问题标题】:Modify python var using linux terminal使用linux终端修改python var
【发布时间】:2017-11-25 01:22:23
【问题描述】:

我使用 Python 编写了一些基本的 Tkinter 文本标签,但我想使用 Linux 终端中的命令修改标签内的文本。

这是我的代码:

#! /usr/bin/python
from tkinter import *
outputText = 'Libre'

root = Tk()

w = 70
h = 50

ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()

x = (ws/10) - (w/5)
y = (hs/5) - (h/5)

root.geometry('%dx%d+%d+%d' % (w,h,x,y))

root.overrideredirect(1)

var = StringVar()

l = Label(root, textvariable=var)
l.pack()
l.place(x=10, y=10)

var.set(outputText)

root.mainloop()

【问题讨论】:

  • 如果你用谷歌搜索“进程间通信”,你会发现很多程序之间的通信方式。套接字或 dbus 可能是最常见的。

标签: python linux tkinter command


【解决方案1】:

有很多方法。我首先想到的是命名管道(又名 fifo)。这是python代码(由于您的tkinter导入,我假设python3即使您的shebang是针对python2的):

#!/usr/bin/env python3

import tkinter as tk
import os
import stat
from threading import Thread

class FIFO(Thread):
    def __init__(self, pipename, func):
        self.pipename = pipename
        if pipename in os.listdir('.'):
            if not stat.S_ISFIFO(os.stat(self.pipename).st_mode):
                raise ValueError("file exists but is not a pipe")
        else:
            os.mkfifo(pipename)
        Thread.__init__(self)
        self.func = func

        self.daemon = True
        self.start()

    def run(self):
        while True:
            with open(self.pipename) as f: # blocks
                self.func(f.read())

    def close(self):
        os.remove(self.pipename)

root = tk.Tk()
var = tk.StringVar(value='Libre')

# pipes the content of the named pipe "signal" to the function "var.set"
pipe = FIFO("signal", var.set)

l = tk.Label(root, textvariable=var)
l.pack(fill=tk.BOTH, expand=True)
root.geometry("200x100")
root.mainloop()
pipe.close()

此示例创建一个名为“signal”的管道,因此您写入该管道的任何内容都会设置在变量中。例如,如果您在同一文件夹中打开一个新终端并键入

echo I am a cucumber > signal

然后 tkinter 窗口中的 Label 变为“I am a cucumber”。

您也可以从任何其他程序或编程语言访问它。例如,如果你想从另一个 python 程序发送数据:

with open('signal', 'w') as f:
    f.write('I am a banana')

命名管道被设计成允许许多程序写入它们,但只有一个程序应该读出数据。

【讨论】:

    【解决方案2】:

    很大程度上取决于您这样做的原因。当值在程序的生命周期内不需要更改时,这里有两种可能的解决方案。

    如果它是机器特定的消息,环境变量可能是要走的路。

    outputText = os.environ.get('WELCOME_MESSAGE', 'Good luck')
    

    设置变量:

    > export WELCOME_MESSAGE='Admin email: admin@mail.com'
    

    如果每次调用时都需要更改 CLI arg。

    outputText = sys.argv[1]
    

    设置变量:

    > my_tk.py 'Instance specific message'
    

    查看argparse 以获得更强大的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2011-10-20
      相关资源
      最近更新 更多