2017-06-21 111 views
0

我用Python編寫了一些基本的Tkinter文本標籤,但是我想使用Linux終端中的命令修改標籤內部的文本。使用linux終端修改python var

這是我的代碼:

#! /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() 
+0

如果你谷歌「進程間通信」,你會發現很多方法讓程序相互溝通。套接字或dbus可能是最常見的。 – Novel

回答

0

有很多很多的方式。首先想到的是一個命名管道(又名fifo)。下面是Python代碼(我假設python3因爲即使你的家當是python2您Tkinter的進口):

#!/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() 

此示例創建一個名爲「信號」管,所以你寫東西給管被設置在變量中。例如,如果你打開在同一文件夾一個新的終端輸入

echo I am a cucumber > signal 

則標籤中的Tkinter窗口更改爲「我是黃瓜」。

您還可以通過任何其他程序或編程語言訪問此功能。例如,如果你想從另一個Python程序發送數據:

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

命名管道設計,讓許多程序寫信給他們,但只有一個方案應進行讀取數據。

+0

謝謝,它工作! –