簡體   English   中英

OpenERP 7:如何使按鈕在剪貼板中插入預定義的文本?

[英]OpenERP 7 : How can I make a button inserting a predefined text in the Clipboard?

我是OpenERP和Python的新手,這是我的問題:

在表單視圖中,用戶可以看到一個客戶的地址,我的任務是添加一個按鈕,當用戶單擊該按鈕時,該地址會保存在剪貼板中,因此用戶只需將其粘貼到他想要的位置即可,而不是選擇文本並使用快捷鍵進行復制。

這是我嘗試過的最后一件事,我對人們在Internet上給出的許多不同答案感到有些困惑,但我對功能還不太滿意:

from openerp.osv import fields, orm
import sys
import gtk
import pygtk
pygtk.require('2.0')


class address_copy(orm.Model):

    _inherit = "res.partner"

    def address_copy(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        address = partner.street + '\n' + partner.zip + ' ' + partner.city + '\n' + partner.country_id + ', ' + partner.state_id
        self.clipboard_clear()
        self.clipboard_append(address)

使用此模塊更新數據庫時沒有任何問題,但是當我單擊創建的按鈕時,出現此錯誤:

2015-05-01 15:45:12,305 20229 ERROR Armand openerp.osv.osv: Uncaught exception
Traceback (most recent call last):
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
  return f(self, dbname, *args, **kwargs)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
  res = self.execute_cr(cr, uid, obj, method, *args, **kw)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
  return getattr(object, method)(cr, uid, *args, **kw)
 File "/home/odoo/addons/7.0/purchase/partner.py", line 44, in copy
  return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
TypeError: copy() got an unexpected keyword argument 'default'
2015-05-01 15:45:12,305 20229 ERROR Armand openerp.netsvc: copy() got an unexpected keyword argument 'default'
Traceback (most recent call last):
 File "/home/odoo/server/7.0/openerp/netsvc.py", line 296, in dispatch_rpc
  result = ExportService.getService(service_name).dispatch(method, params)
 File "/home/odoo/server/7.0/openerp/service/web_services.py", line 626, in dispatch
  res = fn(db, uid, *params)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 190, in execute_kw
  return self.execute(db, uid, obj, method, *args, **kw or {})
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
  return f(self, dbname, *args, **kwargs)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
  res = self.execute_cr(cr, uid, obj, method, *args, **kw)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
  return getattr(object, method)(cr, uid, *args, **kw)
 File "/home/odoo/addons/7.0/purchase/partner.py", line 44, in copy
  return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
TypeError: copy() got an unexpected keyword argument 'default'

因此,問題似乎出在partner.py中的此復制函數中,盡管我的課程繼承了該模塊,但我並未對其進行任何更改,並且我並不真正知道它是如何工作的。 這是partner.py中的復制功能:

from openerp.osv import fields, osv

class res_partner(osv.osv):
    _name = 'res.partner'
    _inherit = 'res.partner'

    def copy(self, cr, uid, id, default=None, context=None):
        if default is None:
            default = {}

        default.update({'purchase_order_ids': []})

    return super(res_partner, self).copy(cr, uid, id, default=default, context=context)

    _columns = {
        'property_product_pricelist_purchase': fields.property('product.pricelist', type='many2one', relation='product.pricelist', domain=[('type','=','purchase')], string="Purchase Pricelist", view_load=True, help="This pricelist will be used, instead of the default one, for purchases from the current partner"),
        'purchase_order_count': fields.function(_purchase_order_count, string='# of Purchase Order', type='integer'),
        'purchase_order_ids': fields.one2many('purchase.order','partner_id','Purchase Order')
    }
res_partner()

您是否知道如何使它起作用? 我的功能也可能是錯誤的。 在此先感謝所有嘗試幫助我的人! 如果太復雜,也許也可以選擇僅選擇文本以便用戶直接復制的按鈕。

編輯:如果我嘗試從OpenERP的銷售模塊中啟動它,使用一個簡單的按鈕和一個函數“ pyperclip.copy(” string“),就會出現此錯誤:

OpenERP Server Error

Client Traceback (most recent call last):
 File "/home/odoo/web/7.0/addons/web/http.py", line 204, in dispatch response["result"] = method(self, **self.params)
 File "/home/odoo/web/7.0/addons/web/controllers/main.py", line 1132, in call_button
  action = self._call_kw(req, model, method, args, {})
 File "/home/odoo/web/7.0/addons/web/controllers/main.py", line 1120, in _call_kw
  return getattr(req.session.model(model), method)(*args, **kwargs)
 File "/home/odoo/web/7.0/addons/web/session.py", line 42, in proxy
  result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
 File "/home/odoo/web/7.0/addons/web/session.py", line 30, in proxy_method
  result = self.session.send(self.service_name, method, *args)
 File "/home/odoo/web/7.0/addons/web/session.py", line 103, in send
  raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)


Server Traceback (most recent call last):
 File "/home/odoo/web/7.0/addons/web/session.py", line 89, in send
  return openerp.netsvc.dispatch_rpc(service_name, method, args)
 File "/home/odoo/server/7.0/openerp/netsvc.py", line 296, in dispatch_rpc
  result = ExportService.getService(service_name).dispatch(method, params)
 File "/home/odoo/server/7.0/openerp/service/web_services.py", line 626, in dispatch
  res = fn(db, uid, *params)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 190, in execute_kw
  return self.execute(db, uid, obj, method, *args, **kw or {})
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
  return f(self, dbname, *args, **kwargs)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
  res = self.execute_cr(cr, uid, obj, method, *args, **kw)
 File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
  return getattr(object, method)(cr, uid, *args, **kw)
 File "/home/odoo/personnal_addons/sale_option/sale_option.py", line 664, in copy
  return super(sale_order, self).copy(cr, uid, id, default, context=context)
 File "/home/odoo/addons/7.0/sale_stock/sale_stock.py", line 49, in copy
  return super(sale_order, self).copy(cr, uid, id, default, context=context)
 File "/home/odoo/addons/7.0/sale/sale.py", line 87, in copy
  return super(sale_order, self).copy(cr, uid, id, default, context=context)
 File "/home/odoo/server/7.0/openerp/osv/orm.py", line 5126, in copy
  data = self.copy_data(cr, uid, id, default, context)
 File "/home/odoo/addons/7.0/mail/mail_thread.py", line 326, in copy_data
  return super(mail_thread, self).copy_data(cr, uid, id, default=default, context=context)
 File "/home/odoo/server/7.0/openerp/osv/orm.py", line 5023, in copy_data
  data = self.read(cr, uid, [id], fields_to_copy.keys(), context=context)
 File "/home/odoo/server/7.0/openerp/osv/orm.py", line 3679, in read
  result = self._read_flat(cr, user, select, fields, context, load)
 File "/home/odoo/server/7.0/openerp/osv/orm.py", line 3730, in _read_flat for sub_ids in cr.split_for_in_conditions(ids):
 File "/home/odoo/server/7.0/openerp/sql_db.py", line 258, in split_for_in_conditions
  return tools.misc.split_every(self.IN_MAX, set(ids))
TypeError: unhashable type: 'list'

您的代碼中有很多問題。 因此,除非您最清楚地了解問題,否則就很難找到問題。

在這段代碼中

address = partner.street + '\n' + partner.zip + ' ' + partner.city + '\n' + partner.country_id + ', ' + partner.state_id

您沒有partner對象來獲取地址詳細信息。

然后在這段代碼中

partner.country_idpartner.state_id您將獲得一個對象。 因此,您需要使用partner.country_id.name或所需的任何字段。

然后在這段代碼中,我希望您嘗試使用tkinter模塊執行剪貼板操作。

self.clipboard_clear()
self.clipboard_append(address)

為此,您需要tkinter類中的一個對象。 它是一個跨平台的GUI庫。 嘗試這個

from openerp.osv import fields, orm
from Tkinter import Tk

class address_copy(orm.Model):

    _inherit = "res.partner"

    def address_copy(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        for partner in self.browse(cr, uid, ids, context=context):
            r = Tk()
            address = str(partner.street) + '\n' + str(partner.zip) + ' ' + str(partner.city) + '\n' + str(partner.country_id.name) + ', ' + str(partner.state_id.name)
            r.withdraw()
            r.clipboard_clear()
            r.clipboard_append(address)
            r.destroy()

在python3中, from Tkinter import Tk應該是from tkinter import Tk 由於Odoo使用上面的python2.x不會有問題。

或者您可以使用pyperclip模塊。 它將以最少的代碼正常運行。

簡單的例子:

import pyperclip
pyperclip.copy('The text to be copied to the clipboard.')
spam = pyperclip.paste()
print spam

對於您的情況:

from openerp.osv import fields, orm
import pyperclip

class address_copy(orm.Model):

    _inherit = "res.partner"

    def address_copy(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        for partner in self.browse(cr, uid, ids, context=context):
            address = str(partner.street) + '\n' + str(partner.zip) + ' ' + str(partner.city) + '\n' + str(partner.country_id.name) + ', ' + str(partner.state_id.name)
            pyperclip.copy(address)

我個人更喜歡最后一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM