0

我使用 Zelle 的图形包创建了一个游戏“骰子扑克”,并在主屏幕上有一个按钮,可以打开一个文本文件。单击按钮时会打开文本文件,但主窗口会关闭。如何保持父窗口打开?

按钮类如下:

from graphics import *
from tkinter import Button as tkButton

class Button():

    """A button is a labeled rectangle in a window.
    It is activated or deactivated with the activate()
    and deactivate() methods. The clicked(p) method
    returns true if the button is active and p is inside it."""

    def __init__(self, win, center, width, height, label):
        """ Creates a rectangular button, eg:
        qb = Button(myWin, centerPoint, width, height, 'Quit') """

        w,h = width/2.0, height/2.0
        x,y = center.getX(), center.getY()
        self.xmax, self.xmin = x+w, x-w
        self.ymax, self.ymin = y+h, y-h
        p1 = Point(self.xmin, self.ymin)
        p2 = Point(self.xmax, self.ymax)
        self.rect = Rectangle(p1,p2)
        self.rect.setFill('lightgray')
        self.rect.draw(win)
        self.label = Text(center, label)
        self.label.draw(win)
        self.deactivate()

    def clicked(self, p):
        "Returns true if button active and p is inside"
        return (self.active and
                self.xmin <= p.getX() <= self.xmax and
                self.ymin <= p.getY() <= self.ymax)

    def getLabel(self):
        "Returns the label string of this button."
        return self.label.getText()

    def activate(self):
        "Sets this button to 'active'."
        self.label.setFill('black')
        self.rect.setWidth(2)
        self.active = True

    def deactivate(self):
        "Sets this button to 'inactive'."
        self.label.setFill('darkgrey')
        self.rect.setWidth(1)
        self.active = False

如何包含command可以以类似于此 tkinter 实现的方式打开可执行文件的参数:

import Tkinter as tk

def create_window():
    window = tk.Toplevel(root)

root = tk.Tk()
b = tk.Button(root, text="Create new window", command=create_window)
b.pack()

root.mainloop()

命令可以在哪里subprocess.run(['open', '-t', 'poker_help.txt'])并且仍然保持原始窗口打开?

4

1 回答 1

1

我必须做出一些假设,因为您没有包含顶级代码(例如,您在 Mac 上):

Zelle 图形与 tkinter 和 turtle 不同,后者也是基于 tkinter 构建的,它没有显式win.mainloop()调用来将控制权交给 Tk 事件处理程序以空闲等待事件发生。相反,您必须自己修补一个,否则一旦您单击鼠标触发按钮,程序就会通过文件末尾并关闭主窗口:

import subprocess
from graphics import *
from button import Button

win = GraphWin()

help_button = Button(win, Point(150, 150), 50, 50, "Help")
help_button.activate()

quit_button = Button(win, Point(50, 50), 50, 50, "Quit")
quit_button.activate()

while True:
    point = win.getMouse()

    if help_button.clicked(point):
        subprocess.call(['open', '-t', 'poker_help.txt'])
    elif quit_button.clicked(point):
        win.close()

from button import Button上面的按钮代码在哪里。要检查的另一件事是您的窗口实际上正在关闭,而不仅仅是被在其上打开的新窗口所遮挡。

于 2017-07-17T07:52:53.727 回答