我写了一个小的python脚本,只弹出一个包含命令行传递的文本的消息框.我只想在前一次调用的窗口未打开时弹出它.
from Tkinter import *
import tkMessageBox
root = Tk()
root.withdraw()
# TODO not if a window with this title exists
tkMessageBox.showinfo("Key you!", " ".join(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)
知道怎么检查吗?
我编写以下expect脚本以自动ssh登录到远程Linux机器并运行命令"cat /etc/APP_VERSION.txt file"
有时我没有从ssh命令询问 -
"Are you sure you want to continue connecting (yes/no)?"
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,第一个期望仍然等待字符串"(是/否)?" - :(
而不是继续第二个期望 - "密码:"?
怎么解决这个?,
我的意思是"如果您确定要继续连接(是/否)?" 是不是从ssh出现
然后我们必须转到下一个期望"密码:",但是怎么做呢?
remark1 - 如果问题"你确定要继续连接(是/否)?" ,出现然后期望脚本工作正常没有任何问题.
remark2 - 我不能使用超时正值(作为超时10)因为ssh本身有延迟
....
我的期望脚本:(这个期望是我的ksh脚本的一部分)
.
.
.
APP_MACHINE=172.12.6.190
set timeout -1
spawn ssh $APP_MACHINE
expect {
"(Are you sure you want to continue connecting yes/no)?"
{ send "yes\r" }
}
expect password: {send PASS123\r}
expect > {send "cat /etc/APP_VERSION.txt\r"}
expect > {send exit\r}
expect eof
.
.
.
Run Code Online (Sandbox Code Playgroud)
.....
我的linux机器上的ssh示例
ssh …Run Code Online (Sandbox Code Playgroud) 每当我在我的python解释器中尝试以下操作时.即使关闭解释器,我也可以将单词hello复制到命令行
from Tkinter import Tk
r = Tk()
r.clipboard_append(" hello ")
Run Code Online (Sandbox Code Playgroud)
但是,如果我把它放在一个名为test.py的文件中,然后尝试
python test.py
Run Code Online (Sandbox Code Playgroud)
这不起作用,我无法将其附加到系统剪贴板
有没有人知道为什么不知道或者知道在脚本和解释器中运行它会有什么区别
我正在制作我的第一个GUI应用程序而且我遇到了一个愚蠢的问题.调整主窗口大小不会调整其内容的大小并留下空白.我已经阅读过TKDocs,他们只说你应该使用粘性和列/行权重属性,但我真的不明白它们是如何工作的.这是我的代码(只有覆盖小部件的部分,如果你认为问题不在这里,我会发布剩下的部分):
from tkinter import *
from tkinter import ttk
root = Tk()
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
player1 = StringVar()
player2 = StringVar()
player1.set('Player 1')
player2.set('Player 1')
timer=StringVar()
running=BooleanVar()
running.set(0)
settimer = ttk.Entry(mainframe, width=7, textvariable=timer)
settimer.grid(column=2, row=1, sticky=(N, S))
ttk.Button(mainframe, text="Start", command=start).grid(column=2, row=2, sticky=(N, S))
ttk.Label(mainframe, textvariable=player1, font=TimeFont).grid(column=1, row=3, sticky=(W, S))
ttk.Label(mainframe, textvariable=player2, font=TimeFont).grid(column=3, row=3, sticky=(E, S))
for child in mainframe.winfo_children():
child.grid_configure(padx=80, pady=10)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间!
我发现,当顶级小部件调用消息框对话框(例如“ showinfo”)时,将在顶级之上显示根窗口。有没有一种方法可以将“顶级”窗口设置为消息框对话框的主窗口?
这是一个重现此内容的脚本:
# -*- coding:utf-8 -*-
# PYTHON 3 ONLY
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title('ROOT WINDOW')
Label(root, text = 'Place the toplevel window over the root window\nThen, push the button and you will see that the root window is again over the toplevel').grid()
topWindow = Toplevel(root)
topWindow.title('TOPLEVEL WINDOW')
Label(topWindow, text = 'This button will open a messagebox but will\ndo a "focus_force()" thing on the root window').grid()
Button(topWindow, text = '[Push me !]', …Run Code Online (Sandbox Code Playgroud) 是否可以使用tk创建text editor可以支持的内容syntax highlighting,autocomplete甚至可以在以后扩展IDE为特定语言?
我找到了tkinterwidget,但不确定它是否可以支持?
我认为如果一个小部件可以在用户编写文本时对文本进行一些处理,那么它可以用于此目的.
在Page框架中,我在innerFrame中加权了两个框架,这样它们每个都占据了屏幕的一半,但是,当我将一个小部件添加到其中一个框架时,我使用了一个列表框作为示例,因为它很大,其中一个框架现在比另一个占用更多.我如何制作它,以便在添加小部件时每个框架不会改变大小,每个小部件仍然是窗口大小的一半?
这是我的代码:
import tkinter as tk
from tkinter import ttk
class Program(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.iconbitmap(self, default = "")
tk.Tk.wm_title(self, "")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (Page, Other):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(Page)
def show_frame(self,cont):
frame = self.frames[cont]
frame.tkraise()
class Page(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
innerFrame = tk.Frame(self, bg="red")
innerFrame.place(relx=.5, rely=.5, …Run Code Online (Sandbox Code Playgroud) 我正在使用多个Text小部件在Tkinter中创建一个应用程序,我正在研究由KeyPress事件触发的撤消/重做功能.(我没有使用文本小部件的内置撤消堆栈,因为我有非tkinter对象,也可以撤消/重做,我想将所有内容保存在一个堆栈中)
在我开始之前,我阅读了教程和文档(例如http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm),它给了我印象event.char如果按下的键是空的,则为空'特殊'键而不是字母数字/标点符号键.
事实并非如此.按键盘上的退格键(我正在使用运行El Capitan的Macbook Air)返回\ x7f的event.char.
阅读更多有关Tcl/TK的内容,我还了解到X键盘的列表在平台之间并不一致,例如在我的Mac上,Shift键显然有一个键值为0.这意味着我的应用程序解释了不可打印的字符,如删除或Shift键作为可打印字符,这是我的实现搞乱.
无论如何我会分别处理常见的unprintable-key KeyPress事件,但我仍然担心意外的键盘事件行为有两个原因:1)我的程序是多平台的,2)这个机会很有可能程序将由使用非美国键盘的人使用.
我当前的解决方案,使用此作为参考,检查event.keysym_num以查看它是否在可打印字符使用的keysym数字/密钥代码的范围内.
这是示例代码:
from tkinter import *
from tkinter import ttk
root = Tk()
textbox = Text(root, width=60, height=3)
textbox.grid(sticky=(N, S, E, W))
def KeyboardEvent(event):
if event.keysym_num > 0 and event.keysym_num < 60000:
print('This is a printable key. The character is: %r keysym: %r' % \
(event.char, event.keysym_num))
else:
print('This key is unprintable. The character is: %r keysym: %r' % \
(event.char, event.keysym_num))
textbox.bind('<KeyPress>', KeyboardEvent)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我的问题:
这里是新手程序员。我正在构建一个基于 tk 的桌面应用程序,但遇到了一个问题:
我有一个主窗口,其中有几个内容,包括两个选项卡:
global nBook
nBook = ttk.Notebook(self, name="book")
nBook.place(x=300,y=400)
frameOne = ttk.Frame(nBook, width=100, height=100)
frameTwo = ttk.Frame(nBook, width=100, height=100)
nBook.add(frameOne, text='T1')
nBook.add(frameTwo, text='T2')
frameOne.bind("<<NotebookTabChanged>>", self.routine())
frameTwo.bind("<<NotebookTabChanged>>", self.routine())
Run Code Online (Sandbox Code Playgroud)
routine()是一个应该在每次选择 T2 时执行检查的函数
def routine(self):
if str(nBook.index(nBook.select())) == "2":
# Do stuff
else:
pass
Run Code Online (Sandbox Code Playgroud)
问题是,当选项卡更改时,它不会执行任何操作,除了在我打开应用程序后立即调用例程函数,并且不再执行。我只是不明白我做错了什么。
有人能指出我犯的错误吗?
编辑:如果我尝试同样的问题
nBook.bind("<<NotebookTabChanged>>", self.xbRoutine())
Run Code Online (Sandbox Code Playgroud) 当我运行以下脚本时:
import tkinter as tk
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.figure
import matplotlib.backends.backend_tkagg
import numpy as np
def on_key_event(event, canvas, toolbar):
matplotlib.backend_bases.key_press_handler(event, canvas, toolbar)
matplotlib.use('TkAgg')
root = tk.Tk()
root.wm_title('Test window')
fig = matplotlib.figure.Figure(figsize=(9.333, 7), dpi=100)
a = fig.add_subplot(111)
axes = fig.gca()
x = np.linspace(0, 2*np.pi, 100)
axes.plot(x, np.sin(x), marker='.')
axes.set_title('sin(x)')
axes.grid()
canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(fill=tk.X, expand=1)
canvas.mpl_connect(
'key_press_event',
lambda event: on_key_event(event, canvas, toolbar)
)
toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg(
canvas, root
)
toolbar.update()
root.bind('<Control-w>', lambda event: root.destroy())
tk.mainloop() …Run Code Online (Sandbox Code Playgroud) tk-toolkit ×10
python ×7
tkinter ×7
python-3.x ×2
bash ×1
editor ×1
events ×1
expect ×1
frames ×1
linux ×1
matplotlib ×1
messagebox ×1
shell ×1
text ×1