【问题标题】:How to return content in entry to be printed如何返回要打印的条目中的内容
【发布时间】:2017-11-28 14:10:29
【问题描述】:

我试图在我的输入框中返回要打印的内容,但即使我选择了 tkinter 提出的按钮提醒我选择强制按钮,消息框也会弹出。

挑战:

  1. 当我在选择打印按钮之前选择强制按钮时,仍然会弹出消息框。

  2. 如果我不输入条目小部件,它的消息会弹出来提醒我,但选择按钮也会弹出两次,而不是只弹出消息框来提醒我。 也将所有功能传递给打印按钮。我的强制按钮是在选择时抬起,然后在执行命令后返回正常状态。

    import tkinter as tk
    
    from tkinter import messagebox
    import win32print, win32ui, win32con
    
    
    def output():
        global choosed
    
        now = new.get()
    
        if not choosed:
            messagebox.showerror("error", "select the buttons")
        elif len(now) == 0:
            messagebox.showerror("error", "entry empty")
        else:
           return (now)
    
    
    def accept_output():
    
        dc = win32ui.CreateDC()
        printername = win32print.GetDefaultPrinter()
        dc.CreatePrinterDC(printername)
        dc.SetMapMode(win32con.MM_TWIPS)
        scale_factor = 20
        dc.StartDoc('Win32print ')
        pen = win32ui.CreatePen(0, int(scale_factor), 0)
        dc.SelectObject(pen)
        font = win32ui.CreateFont({
            "name": "Lucida Console",
            "height": int(scale_factor * 10),
            "weight": 400,
        })
        dc.SelectObject(font)
        dc.TextOut(scale_factor * 72,-1 * scale_factor * 72, output())# to 
    receive the content in the entry widget
        dc.EndDoc()
    
    
    def raised_button(button_object):
        global choosed
    
        if choosed: # previously clicked
            choosed.configure(relief=tk.RAISED, state=tk.ACTIVE)
    
        choosed = button_object
        button_object.configure(relief=tk.SUNKEN, state=tk.DISABLED)
    
    
    def stop():
        global choosed
    
        choosed = None
    
        lot1.configure(relief=tk.RAISED, state=tk.ACTIVE)
    
    
    root = tk.Tk()
    root.geometry("400x400")
    
    
    new = tk.StringVar()
    en = tk.Entry(root, textvariable=new).pack()
    
    choosed = False
    
    lot1 = tk.Button(root, text="compulsory to select")
    lot1.configure(command=lambda button_object=lot1: 
    raised_button(button_object))
    lot1.pack(side="left")
    
    B=tk.Button(root, text="print number", command=lambda:[output(), stop(), 
    accept_output()])
    B.place(x=150, y=300)
    
    root.mainloop()
    

我在 accept_output() 上添加了 output() 函数,但仍然遇到同样的错误。

   def accept_output():

    global choosed

    now = new.get()

    if not choosed:
       messagebox.showerror("error", "select one of the buttons")
    elif len(now) == 0:
       messagebox.showerror("error", "entry empty")
    else:
        return (now)  # when i add the output here it gives select button

欢迎您提出关于返回条目小部件中的内容的建议,以便通过选择强制按钮打印该内容。

【问题讨论】:

  • 顺便说一句:你不能用output(), stop(), accept_output()而不是列表[output(), stop(), accept_output()]创建普通函数 - 它对人类来说更具可读性。
  • 我结合了 add output() 和 accept_output() 它给出了相同的错误,在 accept_output() 函数之上的 output() 作为一个函数。
  • 我的建议并不能解决您的问题,但它使代码对其他人更具可读性。
  • 顺便说一句:当您执行var = Widget(...).pack(...) 时,您将None 分配给var,因为pack()/grid()/place() 返回None。如果您不需要这个var,那么您可以跳过它并执行Widget(...).pack(...)。如果您需要这个var,那么您必须分两行完成:var = Widget(...)var.pack(...)
  • 我不明白你的问题。我运行代码,它按您的预期工作。你确定你运行相同的代码吗?您是否在具有其他 Tk()mainloop() 的其他程序中运行它?顺便说一句:我在 Linux 上进行测试,所以我必须删除 win32 模块和 accept_output() 中的代码

标签: python tkinter printing pywin32


【解决方案1】:

我认为你这样做是错误的 - 你在 accept_output() 内执行 output() 所以你无法阻止它。当一切正常时,您必须在output() 中执行accept_output()

import tkinter as tk

from tkinter import messagebox
import win32print, win32ui, win32con


def output():
    global choosed

    text = new.get()

    if not choosed:
        messagebox.showerror("error", "select the buttons")
    elif len(text) == 0:
        messagebox.showerror("error", "entry empty")
    else:
        accept_output(text)

    choosed = None
    lot1.configure(relief=tk.RAISED, state=tk.ACTIVE)


def accept_output(text):

    print("printing ...", text)

    dc = win32ui.CreateDC()
    printername = win32print.GetDefaultPrinter()
    dc.CreatePrinterDC(printername)
    dc.SetMapMode(win32con.MM_TWIPS)
    scale_factor = 20
    dc.StartDoc('Win32print ')
    pen = win32ui.CreatePen(0, int(scale_factor), 0)
    dc.SelectObject(pen)
    font = win32ui.CreateFont({
        "name": "Lucida Console",
        "height": int(scale_factor * 10),
        "weight": 400,
    })
    dc.SelectObject(font)
    dc.TextOut(scale_factor * 72,-1 * scale_factor * 72, text) # <- text 
    dc.EndDoc()


def raised_button(button_object):
    global choosed

    # function will be not accesible if you use state=tk.DISABLED
    # so I remove state=tk.DISABLED

    if choosed: # previously clicked 
        choosed.configure(relief=tk.RAISED)
        choosed = None
    else:    
        button_object.configure(relief=tk.SUNKEN)
        choosed = button_object

# --- main ---

choosed = False

root = tk.Tk()

new = tk.StringVar()
tk.Entry(root, textvariable=new).pack()

lot1 = tk.Button(root, text="Compulsory to select")
lot1.configure(command=lambda button_object=lot1:raised_button(button_object))
lot1.pack()

tk.Button(root, text="Print number", command=output).pack()

root.mainloop()

您可以使用Checkbutton 而不是Button,您将不需要函数choosenraised_button。如果您使用indicatoron=FalseCheckbutton 甚至可以看起来像普通按钮。

import tkinter as tk

from tkinter import messagebox
import win32print, win32ui, win32con

def output():

    text = new.get()

    if not option1.get() and not option2.get():
        messagebox.showerror("error", "select options")
    elif len(text) == 0:
        messagebox.showerror("error", "entry empty")
    else:
        accept_output(text)

    option1.set(False)
    option2.set(False)

def accept_output(text):

    print("printing ...", text)

    dc = win32ui.CreateDC()
    printername = win32print.GetDefaultPrinter()
    dc.CreatePrinterDC(printername)
    dc.SetMapMode(win32con.MM_TWIPS)
    scale_factor = 20
    dc.StartDoc('Win32print ')
    pen = win32ui.CreatePen(0, int(scale_factor), 0)
    dc.SelectObject(pen)
    font = win32ui.CreateFont({
        "name": "Lucida Console",
        "height": int(scale_factor * 10),
        "weight": 400,
    })
    dc.SelectObject(font)
    dc.TextOut(scale_factor * 72,-1 * scale_factor * 72, text) # <- text 
    dc.EndDoc()

# --- main ---

root = tk.Tk()

new = tk.StringVar()
tk.Entry(root, textvariable=new).pack()

option1 = tk.BooleanVar(value=False)
tk.Checkbutton(root, text="Compulsory to select (option1)", var=option1).pack()

option2 = tk.BooleanVar(value=False)
tk.Checkbutton(root, text="Compulsory to select (option2)", var=option2, indicatoron=False).pack()

tk.Button(root, text="Print number", command=output).pack()

root.mainloop()

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多